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はもう少し寛大です)。window
a
sed
sed
\
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
するステートメントを組み合わせます。