sed:在一个命令中条件行删除

sed:在一个命令中条件行删除

假设我有以下示例文本example.txt

<para>This is some paragraph text
This is another line of paragraph text.
</para>

我想要实现的目标:用空字符串替换所有<para></para>标签,如果结果行为空,则删除该行。我通过以下两个命令实现了这一点:

# remove the line that solely consist of the para tag.
$ sed -i '/^<para>$/d;/^<\/para>$/d' ./example.txt

# Replace any of the para tags with an empty string.
$ sed -i 's/<para>//g;s/<\/para>//g' ./example.txt

我的问题:是否可以在一个 sed 命令中利用条件行删除来实现这一目标?

答案1

如果您有 GNU sed,T如果替换失败,您可以使用以下命令分支到空行删除:

sed 's/<\/\{0,1\}para>//g;T;/^$/d' example.txt
T label

仅当自上次读取输入行或采用条件分支以来没有成功替换时才分支到标签。标签可以被省略,在这种情况下开始下一个循环。

对于非 GNU sed 应该可以通过组合t和来完成相同的操作b

sed -e 's/<\/\{0,1\}para>//g;ta;b' -e ':a;/^$/d' example.txt

答案2

使用 GNU sed:

$ sed -nE 's|</?para>||g;/./p' file

执行所需的替换,如果之后还剩下一些内容,请将其打印出来。 OTW,您的模式空间,又名当前行,仅包含para和/或/para仅包含标签,并且需要抑制这些记录。

相关内容