我在文件中做了一些替换,如下所示:
file:abc.txt
`include foo.h
int main
{
int foo
foo and bar
barfoobar
}
我想在大括号内替换'foo',但我不想替换include指令中写的'foo'。
我尝试使用:
sed -i "s/\bfoo\b/my_foo/g"
输出:
`include my_foo.h
int main
{
int my_foo
my_foo and bar
barfoobar
}
有什么建议吗?
答案 0 :(得分:1)
匹配未后跟a的字符串。并且可选地后跟行尾
sed -E 's/foo[^.]?$/my_foo/g' test.txt
它需要扩展的正则表达式。 mac上的-E或linux上的-r(man sed)。
有一些正则表达式测试程序,例如http://www.regextester.com/,可以探索正则表达式,或许多IDE内置它们。
答案 1 :(得分:0)
试试这个:
sed -i "/^[^`]/ s/\bfoo\b/my_foo/g"
它的作用是"仅将替换应用于第一个字符不是`(反引号)的行。"
答案 2 :(得分:0)
sed '/include/b; s/foo/my_&/' foo
include foo.h
int main
{
int my_foo
}
这意味着,如果找到include
,则分支跳转到命令的结尾。
答案 3 :(得分:0)
我相信这个命令就是你要找的:
如果您要替换foo
排除include
sed -i '/foo/ {/include/! s/foo/my_foo/g}' test
或者
如果您要替换foo
的所有条目,不包括foo.
sed -i '/foo/ {/foo./! s/foo/my_foo/g}' test
由于最后一行问题和标题似乎含糊不清,我已回答了这两种情况。
会话输出:
$ cat test
include foo.h
int main
{
int foo
}
$
$ sed -i '/foo/ {/foo./! s/foo/my_foo/g}' test
$ cat test
include foo.h
int main
{
int my_foo
}