
while ループでファイルの終わりを確認する方法を知りたいです。ここでやっていることは、「pineapple」、「apple」、「onion」、「orange」などの単語がある場合、grep コマンドを使用して特定の単語を含む行を検索し、「window」というコメントを付けたいということです。たとえば、 を使用するとgrep 'a' 'file'
、「pineapple」、「apple」、「orange」が見つかります。そして、最終的に「pineapple、window、apple、window、orange、window」のように印刷したいのです。そのため、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
行を印刷するためのステートメントを組み合わせたものです。