awk
またはsed
を使用すると、2つの異なるマーカーパターンの間にある行を選択できますか?これらのパターンでマークされた複数のセクションが存在する場合があります。
たとえば、次のファイルが含まれているとします。
abc
def1
ghi1
jkl1
mno
abc
def2
ghi2
jkl2
mno
pqr
stu
そして、開始パターンはabc
であり、終了パターンはmno
です。したがって、次のような出力が必要です。
def1
ghi1
jkl1
def2
ghi2
jkl2
Sedを使用してパターンを1回一致させています。
sed -e '1,/abc/d' -e '/mno/,$d' <FILE>
sed
またはawk
に、ファイルの終わりまで繰り返し実行する方法はありますか?
awk
をフラグとともに使用して、必要なときに印刷をトリガーします。
$ awk '/abc/{flag=1;next}/mno/{flag=0}flag' file
def1
ghi1
jkl1
def2
ghi2
jkl2
これはどのように作動しますか?
/abc/
は、/mno/
と同様に、このテキストを持つ行に一致します。/abc/{flag=1;next}
は、テキストflag
が見つかったときにabc
を設定します。次に、その行をスキップします。/mno/{flag=0}
は、テキストflag
が見つかったときにmno
の設定を解除します。flag
は、デフォルトのアクションを持つパターンです。これは、print $0
に対するものです。flag
が1の場合、行が出力されます。より詳細な説明と例、およびパターンが表示される場合とされない場合については、「 2つのパターン間の行を選択する方法? 」を参照してください。
sed
の使用:
sed -n -e '/^abc$/,/^mno$/{ /^abc$/d; /^mno$/d; p; }'
-n
オプションは、デフォルトでは印刷しないことを意味します。
パターンは、abc
からmno
のみを含む行を探し、{ ... }
でアクションを実行します。最初のアクションはabc
行を削除します。 2番目のmno
行。 p
は残りの行を出力します。必要に応じて正規表現を緩和できます。 abc
..mno
の範囲外の行は、単に印刷されません。
これはあなたのために働くかもしれません(GNU sed):
sed '/^abc$/,/^mno$/{//!b};d' file
abc
とmno
で始まる行の間の行を除くすべての行を削除します
sed '/^abc$/,/^mno$/!d;//d' file
ppotong's{//!b};d
より2文字良い
空のスラッシュ//
は、「最後に使用した正規表現を再利用する」ことを意味します。コマンドはより理解しやすいものと同じことをします:
sed '/^abc$/,/^mno$/!d;/^abc$/d;/^mno$/d' file
この POSIXのようです :
REが空の場合(つまり、パターンが指定されていない場合)、sedは、最後に適用されたコマンド(アドレスまたは代替コマンドの一部)で使用された最後のREが指定されたように動作します。
前の回答のリンクから、Solarisでkshを実行してくれたのは、これでした:
sed '1,/firstmatch/d;/secondmatch/,$d'
2つの一致するパターン間のテキストのみを表示 ?からのDon_crisstiの回答
firstmatch="abc"
secondmatch="cdf"
sed "/$firstmatch/,/$secondmatch/!d;//d" infile
aWKのアプリケーションよりもはるかに効率的です。 here を参照してください。
Perl -lne 'print if((/abc/../mno/) && !(/abc/||/mno/))' your_file
このような何かが私のために働く:
file.awk:
BEGIN {
record=0
}
/^abc$/ {
record=1
}
/^mno$/ {
record=0;
print "s="s;
s=""
}
!/^abc|mno$/ {
if (record==1) {
s = s"\n"$0
}
}
使用:awk -f file.awk data
...
編集:O_o fedorquiソリューションは私のものよりもはるかに良い/きれいです。
pattern2もpattern1と一致のときに、2つのパターン間の行を印刷するためにawk
を使用しようとしました。また、pattern1行も印刷する必要があります。
例えばソース
package AAA
aaa
bbb
ccc
package BBB
ddd
eee
package CCC
fff
ggg
hhh
iii
package DDD
jjj
の出力が必要です
package BBB
ddd
eee
Pattern1がpackage BBB
である場合、pattern2はpackage \w*
です。 CCC
は既知の値ではないため、文字通り一致させることはできません。
この場合、@scaiのawk '/abc/{a=1}/mno/{print;a=0}a' file
も@fedorquiのawk '/abc/{a=1} a; /mno/{a=0}' file
も機能しません。
最後に、私はawk '/package BBB/{flag=1;print;next}/package \w*/{flag=0}flag' file
でそれを解決することができました、ハハ
もう少し努力すると、awk '/package BBB/{flag=1;print;next}flag;/package \w*/{flag=0}' file
になり、pattern2行も印刷します。つまり、
package BBB
ddd
eee
package CCC