2013-04-25 200 views
1

我有这样的sed命令:Unix命令

sed 's/old/new/g' file.txt 

,但它也将替换字符串“文件夹”里面的老。我如何替换字符串,如果没有字符在左边或右边?

回答

1

要与SED不支持PCRE字边界扩展版本兼容,你需要效仿该扩展自己的影响:

sed -r '[email protected](^|[^[:alpha:]])old($|[^[:alpha:]])@\1new\[email protected]' 
+1

我不知道'[[:空间:] ]'应该是'[^ [:alpha:]]'或'[^ [:alnum:]]'?应该允许标点符号和空格作为分隔符。尽管如此,这是一个可靠的,尽管冗长的方法。 – 2013-04-25 00:46:57

+0

@JonathanLeffler良好的呼唤;采纳。 – 2013-04-25 01:01:16

2

使用\b

's/\bold\b/new/g'

我通常坚持perl:

perl -pi -e 's/\bold\b/new/g' file.txt

+3

''b' *只*保证为perl工作;它不受POSIX标准sed支持。因此,这不是平常习惯的问题,而是任何想要使用这个答案的人的必要性,并且有理由相信它会起作用。 – 2013-04-25 00:28:31

+1

OP没有进行就地更换。在你的Perl命令行中使用'-i'使得它非常相当危险。 – 2013-04-25 02:26:32

3

如果不挑剔,双方插入空白将为你工作。

sed 's/ old/new /g' file.txt 
+0

在字符串的开头或结尾不起作用。不适用于任何其他形式的空白。不适用于其他字词终止字符。这是一大堆“不挑剔”。 – 2013-04-25 04:32:28

+0

\ <...\> - 标记单词边界,上面的一个应该是正确的。 – XuZhangning 2013-04-25 06:30:36

+1

这对于GNU sed是正确的,但不是由POSIX指定的。 (http://pubs.opengroup.org/onlinepubs/009695399/utilities/sed.html) – 2013-04-25 11:43:37

1

这可能会为你工作:

sed 's/\<old\>/new/g' file 

顺便说一句,如果你想的相反(使用GNU SED):

sed 's/\Bold\B/new/g' file 
+0

第一种形式也是非POSIX(但支持GNU sed等)。 – 2013-04-25 16:24:31