【发布时间】:2013-04-25 00:20:43
【问题描述】:
我有这个 sed 命令:
sed 's/old/new/g' file.txt
但它也替换了字符串“文件夹”中的旧版本。如果字符串的左侧或右侧没有字符,如何替换字符串?
【问题讨论】:
我有这个 sed 命令:
sed 's/old/new/g' file.txt
但它也替换了字符串“文件夹”中的旧版本。如果字符串的左侧或右侧没有字符,如何替换字符串?
【问题讨论】:
如果不挑剔,在两边插入空白对你有用。
sed 's/ old / new /g' file.txt
【讨论】:
使用\b:
's/\bold\b/new/g'
我通常坚持使用 perl:
perl -pi -e 's/\bold\b/new/g' file.txt
【讨论】:
\b only 保证适用于 perl; POSIX 标准 sed 不支持它。因此,这不是通常的习惯问题,而是任何想要使用此答案并有理由相信它会起作用的人的必要条件。
-i 会使它危险地不等效。
要与不支持 PCRE 字边界扩展的 sed 版本兼容,您需要自己模拟该扩展的效果:
sed -r 's@(^|[^[:alpha:]])old($|[^[:alpha:]])@\1new\2@g'
【讨论】:
[[:space:]]应该是[^[:alpha:]]还是[^[:alnum:]]?标点符号和空格可能应该被允许作为分隔符。然而,这是一种可靠的方法,虽然很冗长。
这可能对你有用:
sed 's/\<old\>/new/g' file
顺便说一句,如果你想要相反的(使用 GNU sed):
sed 's/\Bold\B/new/g' file
【讨论】: