sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'段落の印刷方法[重複]

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'段落の印刷方法[重複]

次のsedコマンドが段落を印刷する方法を説明できる人はいますか?

注文する:

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' file

可能であれば、誰でもこのコマンドをさまざまな部分に分けて説明し、さまざまな条件に基づいてコマンドを変更する方法を完全に理解できます。

答え1

注文する

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' file

文字列を含む段落を印刷しますAAA

sedこれは次のスクリプトを使用して呼び出されますsed

/./{
    H
    $!d
}
x
/AAA/!d

注釈付きバージョン:

/./{        # When hitting a line that contains at least one character...
    H;      # Append the line to the "hold space".
    $!d;    # If it's not the last line, delete it.
}
x;          # Swap the hold space and the pattern space.
/AAA/!d;    # Delete the pattern space if it does not contain the string "AAA"
            # (implicit print)

つまり、「予約済みスペース」(通常のバッファ入力)から1行ずつ収集し、空の行sed(パターンの不一致)を見つけると、保存された行/./セットに対応する文字列が含まれていることを確認してAAA印刷します(存在する場合)。一つ)。

これはここの答えでも説明されています。GREP / SEDまたはAWK:パターンマッチングに基づいてファイルの全体の段落を印刷します。

与えられたファイル

this is
a paragraph

this is
another one

this paragraph
contains the string
AAA

最後の段落(前に空行を含む)が出力されます。

各出力段落の前の空行を削除するには(必要に応じて)、次のようにします。

/./{
    H
    $!d
}
x
/AAA/!d
s/\n//

またはコマンドラインから

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;s/\n//'

関連情報