sed 脚本删除所有带有模式的行并在末尾附加行

sed 脚本删除所有带有模式的行并在末尾附加行

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

您应该添加第二个条件 - 仅当不是最后一行时才删除,并且在最后一行上使用apend 而不是替换在匹配后删除该行,例如

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

这样做的好处是清晰且易于维护。

相关内容