使用sed后跟一个点(。)替换特定字符串

时间:2017-01-27 04:07:54

标签: bash shell unix sed substitution

我在文件中做了一些替换,如下所示:

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
}

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

匹配未后跟a的字符串。并且可选地后跟行尾

sed  -E 's/foo[^.]?$/my_foo/g' test.txt   

它需要扩展的正则表达式。 mac上的-E或linux上的-r(man sed)。

有一些正则表达式测试程序,例如http://www.regextester.com/,可以探索正则表达式,或许多IDE内置它们。

e.g。 Regex to match URL end-of-line or "/" character

答案 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
}