如何在序列中使用 sed

如何在序列中使用 sed

看起来 sed 并行运行以下脚本,但我希望它按顺序执行。

printf '%s\n' aa bb cc dd | sed 's/bb/\nff/g;/^$/d'

此 sed 脚本将 bb 替换为 ff 并添加换行符,同时删除空行。

假设我想要添加换行符,然后删除我刚刚添加的新行。

答案1

sed通常一次处理文件一行,但如果添加换行符(或使用某些sed读取/添加内容到“模式空间”的命令),它可以同时包含多行。特别是当您的sed脚本处理“ bb”行时,它首先将其替换为“ \nff”(其中\n代表实际的换行符),然后将整个模式空间与 regex 进行比较^$,发现它不匹配,并忽略该命令。 (注意:在这种情况下,^and$不是指行的开头和结尾,而是指模式空间的开头和结尾)。

解决方案:如果我正确理解你的目标,第二个测试应该检查以换行符 ( ^\n) 开头的模式空间,如果是,则删除换行符 (不是整个模式空间)。您可以通过替换来做到这一点s/^\n//

本质上,如果“bb”模式位于行的开头,则这将添加换行符,但如果它位于行的后面,则不会添加换行符:

$ printf '%s\n' aa bb cc dd prefixbbsuffix | sed 's/bb/\nff/g;s/^\n//'
aa
ff
cc
dd
prefix
ffsuffix

或者,您可以运行两个单独的sed命令,因此第二个命令重新创建行,将添加的行视为单独的项目:

printf '%s\n' aa bb cc dd prefixbbsuffix | sed 's/bb/\nff/g' | sed '/^$/d'
aa
ff
cc
dd
prefix
ffsuffix

如果这不是您的实际目标,请编辑您的问题以澄清它。

相关内容