shell - 変数 - sedコマンドは無作為に指定されたファイルを作成する




シェルスクリプト if (3)

-iは新しい/出力ファイルに与えられる接尾辞です。 また、コマンドには-eが必要です。
使用方法は次のとおりです。

sed -i '2' -e 's/string1/string2/g' test.txt

これにより、 test.txtのバックアップであるtest.txtというファイルが作成されます

ファイルを置換するには(新しいコピーを作成するのではなく、「インプレース」置換と呼ばれます)、- -i値を'' (つまり空白)に変更し-i

sed -i '' -e 's/string1/string2/g' test.txt

EDIT II

実際にコマンドラインから出力されたMac(Snow Leopard)の出力は、修正された解答(-iとサフィックスの間のスペースの削除)が正しいことを示しています。
注記:Linuxサーバでは、 -iと接尾辞の間にスペースを入れてはいけません。

> echo "this is a test" > test.txt
> cat test.txt
this is a test
> sed -i '2' -e 's/a/a good/' test.txt 
> ls test*
test.txt    test.txt2
> cat test.txt
this is a good test
> cat test.txt2
this is a test
> sed -i '' -e 's/a/a really/' test.txt 
> ls test*
test.txt    test.txt2
> cat test.txt
this is a really good test

最近sedコマンドを実行するスクリプトを書いて、 "test1.txt"という名前のファイルで "string1"のすべての文字列を "string2"に置き換えました。

これは次のようになります。

sed -i 's/string1/string2/g' test.txt

catchは、 "string1"がtest.txtに必ずしも存在しないということです。

私はこれらのsedコマンドの束を実行した後で気付きましたが、ディレクトリ内に空のファイルがたくさんあり、その名前は次のようになります。

"sed4l4DpD"

なぜ誰がこのことが分かっているのか、どうすればそれを訂正できるのか誰にも分かりますか?


そのため、昨夜のテストのあと、空の文字列を操作しようとしているときにsedがこれらのファイルを作成していたことが判明しました。 私が "$ string1"引数の配列を取得していたのは、grepコマンドによるものでした。これは不正な形式です。 私がgrepから欲しかったのは、 "Text here"というタイプのものを含んだすべての行でした。

たとえば、ファイル内の " Text here 'ABC.DEF'という文字列がgrepによってキャッチされていて、その文字列のABC.DEF部分がABC.DEFに置き換えられているABC_DEFです。 残念ながら、私が使用していたgrepは、 " Text here '' "(つまり' 'の間には何もない)タイプの行をキャッチします。 後でこのスクリプトはこの空文字列を使ってsed置換を実行しようとしましたが、ランダムファイルが作成されました(おそらくsedが終了したためです)。

どのようにsedが働くかを理解する上で、あなたの助けに感謝します。


あなたがこのようにすれば、その方が良い:

cat large_file | sed 's/string1/string2/g' > file_filtred





sed