awkを使う

awkを使う

whileループでファイルの終わりを確認する方法を知りたいです。ここで私がやっていることは、「pineapple」、「apple」、「onion」、「orange」などのような単語がある場合です。 grepコマンドを使用して特定の単語を含む行を見つけ、「windows」の説明を作成したいと思います。 。たとえば、を使用すると、grep 'a' 'file'「パイナップル」、「リンゴ」、「オレンジ」が検索されます。そして最後に、「パイナップル、窓、りんご、窓、オレンジ、窓」のようなものを印刷したいと思います。だからwhileまたはforループでいくつかの条件を設定したいと思います。どんな助けでも大変感謝します。

編集:例を入力

apple
banana
pineapple
orange
mandu
ricecake
meat
juice
milk
onion
green onion

grepコマンドを使用したときに予想される出力 -->grep 'a' 'file name'

apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

答え1

awkを使う

window一致する各行の後に印刷しますa

$ awk '/a/{print; print "window"}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

どのように動作しますか?

/a/{...}正規表現に一致する行を選択してくださいa。各行に対して中括弧で囲まれたコマンドが実行されます。

print一致する内容を含む行の印刷

print "window"印刷window

sedを使う

$ sed -n '/a/{s/$/\nwindow/; p}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

どのように動作しますか?

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

/a/{...}正規表現に一致する行を選択してくださいa。この行の場合、中かっこで囲まれたコマンドが実行されます。

s/$/\nwindow/window現在行の末尾に改行文字を追加します。

p印刷。

答え2

$ grep 'a' file | sed 'a\window'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

これは元のコマンドを使用し、GNUの(「append」)コマンドを使用してgrep各結果行の後に単語を追加します(標準では挿入されたテキストの後ろと末尾に改行が必要ですが、GNUはもう少し寛大です)。windowasedsed\sed

または単にGNUを使用してくださいsed

$ sed -n -e '/a/{p;a\window' -e '}' file
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

このsed式は、その文字を含む各行を印刷しaてから文字列を追加しますwindow

答え3

シェルメソッドは次のように使用できます。

while IFS= read -r line || [ -n "$line" ]; do
    case "$line" in
        *a*) printf "%s\nwindow\n" "$line"
    esac
done < input.txt

while IFS= read -r line; do...done < file.txtこれは、ファイルを読み取る一般的なループ、case特定の文字を含む行を一致させるステートメント、および追加の行をprintf印刷windowするステートメントを組み合わせます。

関連情報