2013-04-25 198 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