看起来 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
如果这不是您的实际目标,请编辑您的问题以澄清它。