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