一致するパターンを含む行を除いて、次の行を削除します。

一致するパターンを含む行を除いて、次の行を削除します。

sed '/pattern/Q'またはを使用して、一致するパターンの下の行を削除できますが、sed '/pattern/,$d'一致するパターンを含む行も削除されます。

一致するパターンを含む行を除いて、その下の行のみを削除する方法は?

答え1

Q以下を使ってこれを複雑すぎるようにしています。GNU sed 関連コマンド:

Q [終了コード]

このコマンドは1つのアドレスのみを受け入れます。

このコマンドは q と同じですが、パターン空間の内容を印刷しません。 qと同様に、呼び出し側に終了コードを返す機能を提供します。

もしあなたならいいえこの特定の動作が必要です(例:する終了する前に一致するパターン・スペースの内容を印刷するには、次の一般qコマンドを使用します。

sed '/pattern/q'

答え2

これはトリックを行う必要があります

sed -n '/pattern/{p;q};p'

この-nスイッチはsedデフォルトでは印刷されません。

{p;q}パターンが観察されたら、ラインを印刷して終了することを示します。

;p一致するものがない場合、デフォルトのジョブは印刷です。

答え3

単純さ、明確さ、および移植性のために、awkは、正規表現(3この場合はa)と一致する行の下のすべての行を削除するなどの操作でsedよりも優れた選択肢です。

$ seq 10 | awk '{print} /3/{exit}'
1
2
3

または、一致する行を削除するには、印刷後ではなく、印刷前の正規表現がテストされる場所を移動します。

$ seq 10 | awk '/3/{exit} {print}'
1
2

または、3回発生後に4行を削除することもできます。

$ seq 10 | awk 'NR>n{print} /3/{n=NR+4}'
1
2
3
8
9
10

またはイディオム「f」を使用してください印刷には sed- または awk-a-line-follow-a-matching-pattern を使用します。:

$ seq 10 | awk 'c&&c--{next} /3/{c=4} {print}'
1
2
3
8
9
10

このコマンドは、すべてのUnixシステムのすべてのawkで動作し、必要なものと同様の操作を実行するのは簡単です。

答え4

使用真珠:

~$ seq 10 | perl -pe 'last if /3/'
1
2

#OR:

~$ seq 10 | raku -ne '/3/ ? last : print $_;'
1
2

使用幸せ(以前のPerl_6):

~$ seq 10 | perl -pe 'last if /3/'
1
2

#OR:

~$ seq 10 | raku -ne '/3/ ?? (last) !! (put $_);'
1
2

sedPerlとRakuはawk。フラグの上の-pe入力でコードを1行ずつ実行します。そして自動印刷、フラグは-ne入力時にコードを1行ずつ実行します。いいえ自動的に印刷します。上記の4つの答えすべてで、1行ずつlastループを終了することが使用されます。 PerlとRakuの三項演算子の間には微妙な違いがあります。その理由は、主にRakuが:言語の他の側面にコロンを配置するためです。

https://perldoc.perl.org
https://docs.raku.org

関連情報