谁能解释一下下面的 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//'