特定のパターンが一致した後、特定の行数を削除したいと思います。
誰でもこのコマンドを使ってこれを行う方法を教えてくださいsed
。
答え1
sed -ne '/pattern/{n;n;n;n;d;}' -e p
一致する行が削除されます。模様その後は4行が出ます。
パターン自体に一致する行を削除したくない場合は、次のようにします。
sed -ne '/pattern/{p;n;n;n;n;d;}' -e p
説明: 現在行が一致する場合模様、[p]はそれを印刷して[n]extを取得し、[n]extと[n]extをインポートし、[n]extと[d]はそれを破棄します。 [d]iscardのため、この場合[p]rintコマンドは実行されません。それは他のすべての行を実行します。-n
自動印刷を無効にすると(これはほとんどすべてが印刷されます)、-e p
結果行を印刷できるようにすることを意味します。
例:
$ seq 8 | sed -ne '/2/{p;n;n;n;n;d;}' -e p
1
2
7
8
行数を数字で指定するには、以下を使用する方が簡単ですawk
。
awk 'n>0 {n--;next}; /pattern/{n=4}; 1'
(これらの解決策はすべてスキップされた行でパターンを見つけません。)
答え2
bashを仮定すると、2つのステップです。 2つの行を削除するとします。後ろに「パターン」を含む行。注:パターンを含む行は削除されませんが、次の2行は削除されます。
N
行を削除するには、grepパラメータでA2
->を変更します。AN
grep -n -A2 pattern inputFile | grep -Ev pattern | sed 's/^\([0-9]*\)-.*/\1/g' > linesToRemove
while read p; do sed -i "${p}d" inputFile; done < linesToRemove
パターンを含む行も削除するには、grepコマンドを次のように変更します。
grep -n -A2 pattern inputFile | sed 's/^\([0-9]*\)[-:].*/\1/g' > linesToRemove
説明:最初のコマンドは、削除する行の行番号を見つけます。 2番目のコマンドは、この行を順番に削除します。使用http://explainshell.com/詳細を学ぶman grep
-i
sedにオプションがない場合は、次の内容をお読みください。https://stackoverflow.com/a/15400287/1729501