foo
文件因多行包含或 而变得混乱bar
。我想删除所有这些并在最后添加一行。
所以,给定一个文件
some stuff
foo1
foo2
bar=42
some other stuff
bar
foo
more stuff
sed 脚本应该返回
some stuff
some other stuff
more stuff
foo
bar
我尝试使用 sed '/foo/d;/bar/d;$s/$/\nfoo\nbar/'
,只要最后一行既不包含foo
也 ,bar
并且文件不为空,它就可以工作。
foo
即使在最后一行,如何使其工作?我想坚持使用 sed,因为整个脚本应该做的不仅仅是这个。当然,我可以在脚本后面添加带有 echo 的行,但我想知道是否没有一体化的解决方案。
编辑:空文件箱不需要处理。
答案1
您应该添加第二个条件 - 仅当不是最后一行时才删除,并且在最后一行上使用a
pend 而不是替换在匹配后删除该行,例如
sed -E '/foo|bar/{$!d
}
${a\
foo\
bar
//d
}' infile
答案2
( sed -e '/foo/d' -e '/bar/d' data.in; cat <<END
foo
bar
END
) >data.out
删除不需要的行,sed
然后简单地添加所需的尾随行cat
并输出到新文件。
或者使用printf
代替cat
:
( sed -e '/foo/d' -e '/bar/d' data.in; printf 'foo\nbar\n' ) >data.out
或者,分两步,
sed -e '/foo/d' -e '/bar/d' data.in >data.out
printf 'foo\nbar\n' >>data.out
这样做的好处是清晰且易于维护。