9

sedの使用を手伝ってください。以下のようなファイルがあります。

START=A
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=B
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=C
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=D
  xxxxx
  xxxxx
END

START=A、END の間のテキストを取得したい。以下のクエリを使用しました。

sed '/^START=A/, / ^END/!d' input_file

ここでの問題は、私が得ていることです

START=A
  xxxxx
  xxxxx
END
START=D
  xxxxx
  xxxxx
END

それ以外の

START=A
  xxxxx
  xxxxx
END

セッドは貪欲に見つけます。

これを解決するのを手伝ってください。

前もって感謝します。

上記を達成するためにAWKを使用できますか?

4

3 に答える 3

26
sed -n '/^START=A$/,/^END$/p' data

この-nオプションは、デフォルトでは印刷しないことを意味します。次に、スクリプトは「を含む行START=Aと次の行の間で印刷を行う」と言いENDます。

次の方法でも実行できますawk

パターンは、コンマで区切られた 2 つのパターンで構成される場合があります。この場合、最初のパターンの出現から 2 番目のパターンの出現までのすべての行に対してアクションが実行されます。

( man awkMac OS X から)。

awk '/^START=A$/,/^END$/ { print }' data

問題のデータ ファイルの変更された形式を考えると、次のようになります。

START=A
  xxx01
  xxx02
END
START=A
  xxx03
  xxx04
END
START=A
  xxx05
  xxx06
END
START=B
  xxx07
  xxx08
END
START=A
  xxx09
  xxx10
END
START=C
  xxx11
  xxx12
END
START=A
  xxx13
  xxx14
END
START=D
  xxx15
  xxx16
END

GNUsedまたは Mac OS X (BSD)を使用した出力sedと、 GNUawkまたは BSDを使用した出力awkは同じです。

START=A
  xxx01
  xxx02
END
START=A
  xxx03
  xxx04
END
START=A
  xxx05
  xxx06
END
START=A
  xxx09
  xxx10
END
START=A
  xxx13
  xxx14
END

印刷されたデータのさまざまなブロックがファイル内のどこから来たのかを簡単に確認できるように、データ ファイルをどのように変更したかに注目してください。

別の出力要件 (「START=A と END の間の最初のブロックのみ」、または「最後の ... のみ」など) がある場合は、質問でそれをより明確に説明する必要があります。

于 2013-05-20T05:51:35.837 に答える
3

基本バージョン...

sed -n '/START=A/,/END/p' yourfile

より堅牢なバージョン...

sed -n '/^ *START=A *$/,/^ *END *$/p' yourfile
于 2013-05-20T06:15:09.833 に答える
2

式の末尾sedの前にスペースがあります/ ^END/。開始パターンsedを取得しますが、終了パターンを取得せず、最後まで印刷を続けます。使用sed '/^START=A/, /^END/!d' input_file(注意/^END/

于 2013-05-20T06:07:24.533 に答える