私はq
sedでコマンドを使用し(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 file
sedが内部的に行うことです。また、GNU sedと同様に、-i
GNU awkを使用-i inplace
すると、通常はsedで簡単な操作を実行するよりも、きれいで簡単に拡張されたスクリプトを書くことができますs/old/new/
。
すべての行を修正して最初の2つだけを印刷するのか、すべての行を印刷して最初の2つだけを変更したいのかわからないので、次のようないくつかの可能性があります。
- 最初の2つの入力行のみを印刷して修正します。
awk '{gsub(/\([0-9]{4}[[:space:]]\){3}/,"XXXX XXXX XXXX "); print} NR==2{exit}' file
- すべての入力行を印刷しますが、最初の2行だけを編集してください。
awk 'NR<=2{gsub(/\([0-9]{4}[[:space:]]\){3}/,"XXXX XXXX XXXX ") {print}' file
GNUと同様に、「内部」編集にGNU awkを使用してくださいsed -i
。
awk -i inplace '...' file