sedでqとsコマンドを一緒に使用するには?

sedでqとsコマンドを一緒に使用するには?

私はqsedでコマンドを使用し(head -n最初の数行だけ模倣してインポートしようとしています)、その行でのみs/パターンを変更しようとしています。

最初の式を省略すると、正確に必要に応じて置換が機能しますが、最初の行にのみ置換を適用しようとすると、最初の置換のみが発生します。-i後でコマンドを使用したいので、headの代わりにsedを使用してください。

sed -e '2q' -e 's/\([0-9]\{4\}[[:space:]]\)\{3\}/XXXX XXXX XXXX /g' file

答え1

表現の順序が重要です。例は次のとおりです。

cat file
a
a
a
a

< file sed '2q; s/a/b/g'
b
a

< file sed 's/a/b/g; 2q'
b
b

だからやめなければなりません。後ろに2行目を交換しました。現在は、代替式を適用する前に終了します。または構文を好む場合-e

< file sed -e 's/a/b/g' -e '2q'

若干異なる状況:

最初の 2 行にのみ置換項目を適用し、ファイル全体を印刷するには、-iこの操作を一緒に実行すると、次のことができます。

< file sed '1,2 s/a/b/g' file
b
b
a
a

行の範囲を一致させ、1,2その範囲に対してのみ次の式を実行します。この範囲内で動作する式が多い場合は、{}次のように含めます。

< file sed '1,2{s/a/b/g; s/c/d/g;}' file

答え2

-iソフトウェアを犠牲にしないでください...これは大きな問題ではなく、head -n file > tmp && mv tmp filesedが内部的に行うことです。また、GNU sedと同様に、-iGNU awkを使用-i inplaceすると、通常はsedで簡単な操作を実行するよりも、きれいで簡単に拡張されたスクリプトを書くことができますs/old/new/

すべての行を修正して最初の2つだけを印刷するのか、すべての行を印刷して最初の2つだけを変更したいのかわからないので、次のようないくつかの可能性があります。

  1. 最初の2つの入力行のみを印刷して修正します。
awk '{gsub(/\([0-9]{4}[[:space:]]\){3}/,"XXXX XXXX XXXX "); print} NR==2{exit}' file
  1. すべての入力行を印刷しますが、最初の2行だけを編集してください。
awk 'NR<=2{gsub(/\([0-9]{4}[[:space:]]\){3}/,"XXXX XXXX XXXX ") {print}' file

GNUと同様に、「内部」編集にGNU awkを使用してくださいsed -i

awk -i inplace '...' file

関連情報