首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用sed选择查找/替换

用sed选择查找/替换
EN

Stack Overflow用户
提问于 2014-06-05 08:01:10
回答 4查看 219关注 0票数 0

我需要在C++源代码中查找和替换:用xyz替换所有出现的_uvw,除非_uvwabc_uvwdef_uvw的一部分。例如:

代码语言:javascript
复制
abc_uvw ghi_uvw;
jkl_uvw def_uvw;

应成为:

代码语言:javascript
复制
abc_uvw ghixyz;
jklxyz def_uvw;

到目前为止,我想出了以下几点:

代码语言:javascript
复制
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替换呢?

EN

回答 4

Stack Overflow用户

发布于 2014-06-05 08:23:48

这个怎么样?

代码语言:javascript
复制
$ 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;
票数 1
EN

Stack Overflow用户

发布于 2014-06-05 08:25:37

这将起作用:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-06-05 09:12:32

你应该用消极的眼光看。例如,在Perl中:

代码语言:javascript
复制
perl -pe 's/(?<!(abc|def))_uvw/xyz/g' file.c

这将对_uvw的任何实例执行全局替换,而这些实例的前面没有abcdef

输出:

代码语言:javascript
复制
abc_uvw ghixyz;
jklxyz def_uvw;

Sed是一个有用的工具,当然也有它的位置,但是Perl在正则表达式方面要强大得多。使用Perl,您可以精确地指定您的意思,而不是以更迂回的方式解决问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24054770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档