web-dev-qa-db-ja.com

ファイルをgrepし、出力をsedにパイプして、sed出力をファイルに保存します

source.txtの内容:

gold  green white black blue
yellow Magenta brown 
tram kilo charlie tango

皆さんこんにちは!私は謎を解く必要があります。

小さなスクリプトを実行してファイルをsource.txtにパイプし、grep出力をsedにパイプして文字列を置き換え、その行を新しいファイルに保存しようとしていますpol.txt

grep -l "gold" source.txt | xargs sed  's/green/red/' >  pol.txt

その行だけをpol.txtに格納する代わりに、

gold  red white black blue

置換した文字列を含むファイル全体を持っています

gold  red white black blue
yellow Magenta brown 
tram kilo charlie tango

オプション-lをgrepコマンドから削除すると、これがあり、もちろんpol.txtには何もありません。

sed: can't read gold: No such file or directory
sed: can't read green: No such file or directory
sed: can't read white: No such file or directory
sed: can't read black: No such file or directory
sed: can't read blue: No such file or directory

grepはテスターとして必要であり、残念ながら "if"はオプションではありません。

3
Driven

Source.txtからgoldを含む行を選択し、最初に出現するgreenredで置き換えるには:

$ sed  -n '/gold/{s/green/red/; p}' source.txt 
gold  red white black blue

それをファイルに保存するには:

sed  -n '/gold/{s/green/red/; p}' source.txt  >pol.txt

使い方

  • -n明示的に要求しない限り、sedに行を印刷しないように指示します。

  • /gold/は、正規表現goldに一致する行を選択します。

  • s/green/red/置換を実行します

  • p印刷します。

Awkの使用

同じロジックで:

$ awk '/gold/{gsub(/green/, "red"); print}' source.txt 
gold  red white black blue

Grepの使用

まだ説明されていない理由で、grepパイプラインを使用せざるを得ない場合は、以下を試してください。

$ grep -l --null "gold" source.txt | xargs -0 sed  -n '/gold/s/green/red/p'
gold  red white black blue
5
John1024

grep -l "gold" source.txtは、ファイルにWordゴールドが含まれている場合はsource.txtを出力しますxargs sed 's/green/red/'sed 's/green/red/' source.txtを実行し、最後のリダイレクトは結果を出力に保存します。

私があなたの意図を正しく理解している場合は、次のコマンドが必要です。

sed -n '/gold/s/green/red/p' source.txt > pol.txt

/gold/goldに一致する行を選択し、sコマンドは必要な置換を行います。

1
Satya Mishra