144

2 つの異なるマーカー パターン間で発生している線を使用awkまたはsedどのように選択できますか? これらのパターンでマークされたセクションが複数ある場合があります。

例: ファイルに次のものが含まれているとします。

abc
def1
ghi1
jkl1
mno
abc
def2
ghi2
jkl2
mno
pqr
stu

そして、開始パターンはabcであり、終了パターンは ですmno 。したがって、次のような出力が必要です。

def1
ghi1
jkl1
def2
ghi2
jkl2

sed を使用してパターンを一度一致させています。

sed -e '1,/abc/d' -e '/mno/,$d' <FILE>

ファイルの終わりまで繰り返し実行する方法はありますsedか?awk

4

10 に答える 10

20

これはうまくいくかもしれません(GNU sed):

sed '/^abc$/,/^mno$/{//!b};d' file

から始まる行の間の行を除いて、すべての行を削除しますabcmno

于 2013-08-01T09:39:57.923 に答える
15
sed '/^abc$/,/^mno$/!d;//d' file

ゴルフはポトンより2文字上手い {//!b};d

空のスラッシュ//は、「最後に使用した正規表現を再利用する」という意味です。コマンドは、より理解しやすいものと同じことを行います。

sed '/^abc$/,/^mno$/!d;/^abc$/d;/^mno$/d' file

これはPOSIXのようです

RE が空の場合 (つまり、パターンが指定されていない場合)、sed は、最後に適用されたコマンド (アドレスまたは代替コマンドの一部として) で使用された最後の RE が指定されたかのように動作します。

于 2015-07-13T09:53:43.077 に答える
10

以前の応答のリンクから、kshSolarisで実行されている私のためにそれを行ったのはこれでした:

sed '1,/firstmatch/d;/secondmatch/,$d'
  • 1,/firstmatch/d: 1 行目から最初に を見つけるまでfirstmatch、削除します。
  • /secondmatch/,$d: の最初の出現からsecondmatchファイルの終わりまで、削除します。
  • セミコロンは、順番に実行される 2 つのコマンドを区切ります。
于 2017-07-12T16:38:10.570 に答える
2
perl -lne 'print if((/abc/../mno/) && !(/abc/||/mno/))' your_file
于 2013-08-01T09:13:08.923 に答える
0

pattern2 も pattern1 と一致awkしている間に、2 つのパターン間の線を印刷するために使用しようとしました。また、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は既知の値ではないため、文字通り一致させることはできません。

この場合、 @scaiawk '/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
于 2019-01-02T08:50:03.170 に答える