sedコマンドを使用してファイルからn行を削除する方法は? [コピー]

sedコマンドを使用してファイルからn行を削除する方法は? [コピー]

特定のパターンが一致した後、特定の行数を削除したいと思います。

誰でもこのコマンドを使ってこれを行う方法を教えてください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

-isedにオプションがない場合は、次の内容をお読みください。https://stackoverflow.com/a/15400287/1729501

関連情報