我需要在C++源代码中查找和替换:用xyz替换所有出现的_uvw,除非_uvw是abc_uvw或def_uvw的一部分。例如:
abc_uvw ghi_uvw;
jkl_uvw def_uvw;应成为:
abc_uvw ghixyz;
jklxyz def_uvw;到目前为止,我想出了以下几点:
find . -type f -print0 | xargs -0 sed -i '/abc_uvw/\!s/_uvw/xyz/g'这将只在不包含_uvw的行中将所有xyz替换为abc_uvw,而(1)不处理这种情况:abc_uvw ghi_uvw;和(2)没有考虑到第二个例外,即def_uvw。
那么,我们将如何进行这种选择性的查找并用sed替换呢?
发布于 2014-06-05 08:23:48
这个怎么样?
$ cat file
abc_uvw ghi_uvw;
jkl_uvw def_uvw;
$ sed 's/abc_uvw/foo/g;s/def_uvw/bar/g;s/_uvw/xyz/g;s/foo/abc_uvw/g;s/bar/def_uvw/g' file
abc_uvw ghixyz;
jklxyz def_uvw;发布于 2014-06-05 08:25:37
这将起作用:
sed -e 's/abc_uvw/AAA_AAA/g; # shadow abc_uvw
s/def_uvw/DDD_DDD/g; # shadow def_uvw
s/_uvw/xyz/g; # substitute
s/AAA_AAA/abc_uvw/g; # recover abc_uvw
s/DDD_DDD/def_uvw/g # recover def_uvw
' input.cpp > output.cpp
cat output.cpp发布于 2014-06-05 09:12:32
你应该用消极的眼光看。例如,在Perl中:
perl -pe 's/(?<!(abc|def))_uvw/xyz/g' file.c这将对_uvw的任何实例执行全局替换,而这些实例的前面没有abc或def。
输出:
abc_uvw ghixyz;
jklxyz def_uvw;Sed是一个有用的工具,当然也有它的位置,但是Perl在正则表达式方面要强大得多。使用Perl,您可以精确地指定您的意思,而不是以更迂回的方式解决问题。
https://stackoverflow.com/questions/24054770
复制相似问题