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)

因此,简而言之,它在“保留空间”(中的通用缓冲区)中逐行收集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//'

相关内容