以下を使用して、sed
ディレクトリ内の複数のファイルの単語を別の単語に置き換えようとします。
sed -n -i 's/pattern/replacement/g' "dir"/*
pattern
私のファイル内の一致する単語が私の単語に置き換えられると思いましたが、replacement
そうではなく、代わりに内部のすべてのファイルのdir
内容が消去されました。
sed's
マンページによると-n
、、--quiet
パターン--silent
空間の自動印刷を抑制します。
私の理解によると、sed
テキスト行を処理する前に最初sed
に配置され、次に置換コマンドなどの特定のコマンドが適用されます。pattern space
sed
s///
次に、デフォルトで結果テキストを印刷します。。
を使用すると、テキストがに印刷されるのを-n
防ぐと思いましたが、私が間違っているようです。重要なファイルのコストが発生してバックアップするのを忘れました T_Tsed
stdout
答え1
sed
代表する」Sトレメ編集するed
itor". ストリーミングバージョンはファイルエディタ。
それではsed
、故意に使用するには、常に標準出力で出力を生成します。それはマニュアルおよびマニュアルで「印刷」という用語を使用する方法仕様。
-i
は非標準拡張すべての実装に存在せず、そのsed
実装で同じように動作することが保証されていないファイルを編集する場合するそれを実装します。 (たとえば、私のシステムでは、バックアップファイル拡張子は次のようになるため、コマンドを実行するとエラーが発生します。必須。つまり、私のシステムではこのようなものを指定し、sed -n -i savemybutt 's/pattern/replacement/g' "dir"/*
編集foo.txt
する前に各ファイルをバックアップする必要がありますfoo.txt.savemybutt
。 )
-i
これが非標準で事後考慮であるという事実は、実装文書sed
(GNU sedと仮定)の標準用語が変更されていないため、依然として「出力生成で」を意味するために「印刷」という用語を使用することを意味します。一般的な意味。
つまり、sed
標準動作モードでは唯一の方法出力を生成する方法は、標準出力として印刷することです。ファイルを編集する方法はありません。したがって、標準動作モードでは、印刷と出力は同じです。いったん入ると-i
状況が少し暗くなりますが、「印刷」まだ「出力生成」を意味します。一般的な意味出力がファイルになっていても、それが「印刷」されるものだからです。いつもその意味。
これ意図それだけ-n
です。ただ次のように明示的に印刷する出力を生成しますp
。
sed -n '/<body>/,/<\/body/p' < some_html_document.html
body
これにより、HTML文書の要素が(ほぼ)印刷されます。 (もちろんこれは愚かな例です。)
答え2
あなたの説明が-n
正しいようです。しかし、あなたは知らないようです-i
。
一般的な動作はstdoutに出力することです。したがって、私の考えでは、-nを使用すると、sedがどのテキストも標準出力として印刷するのを防ぐだけです。
その後、-i
動作を変更して所定の位置に置きます。しかし、いくつかの結果があります。
将来的にそれを避ける方法
次のテストには使用されません-i
。したがって、標準出力に出力されます。突然変異は起こらなかった。 (関数型プログラミング(変化なし)は手続き型プログラミングよりも安全です。)
テストが失敗しない限り、コードを書かないでください。 (問題を引き起こすstdoutはありますか?)
答え3
~によるとman sed
-n, --quiet, --silent
suppress automatic printing of pattern space
これは便利なコマンドではありませんsed
。次のように使用できます。
sed -n 's/pattern/replacement/p' "dir"/*
印刷用。
sed -n -i 's/pattern/replacement/p' "dir"/*
変更された履歴のみを保存
sed -i 's/pattern/replacement/g' "dir"/*
一致するレコードのみを変更