bashでawkを使用して行番号を正しく検索し、sedを使用して削除する方法は?

bashでawkを使用して行番号を正しく検索し、sedを使用して削除する方法は?

Bashからファイルの特定の行を削除したいです。

sed現在私がやっていることは、この行を削除するために行番号を取得して渡すことです。

awk '/qr/{ print NR; exit }' test | sed -i "${1}d" test

ウィジェットはawk正常に動作しますが、この状態ではsedウィジェットはファイル(testという名前)の内容をすべて削除します。

ただし、変数なしでこれを実行すると、次のようになります。

sed -i '1d' test

良い結果。

私は何が間違っていましたか?

ベストアンサー1

${1}現在、コンテキストの最初の引数に置き換えられ、awk例の出力から何も読みません。

awksumを維持したい場合、sed1つの方法はの出力をawk変数に格納することです。

line=$(awk '/qr/{ print NR; exit }' test); sed -i "${line}d" test

ただし、ファイルに「qr」を含む行がないと、正しく機能しません。

より良いアプローチは、以下を使用することですsed

sed -i "/qr/d" test

ただし、これにより、最初の行だけでなく、一致するすべての行も削除されます。

AWK(またはgawkGNU実装、バージョン4.1.0以降)は上記と同じです。

gawk -i inplace '!/qr/' test

または、最初のインスタンスのみを置き換えるには

gawk -i inplace '/qr/ && !i { i++; next; } 1' test

おすすめ記事