Shell sed全词搜索和替换
如何使用sed搜索和替换整个单词 做Shell sed全词搜索和替换,shell,sed,Shell,Sed,如何使用sed搜索和替换整个单词 做 sed-i的/[oldtext]/[newtext]/g' 还将替换我不希望的[oldtext]的部分匹配。\b在正则表达式中匹配单词边界(即第一个单词字符和非单词字符之间的位置): 对单词边界使用\b: sed -i 's/\boldtext\b/newtext/g' <file> sed-i's/\boldtext\b/newtext/g' 在我的一台机器中,用“\b”(不带引号)分隔单词不起作用。解决方案是使用“\”作为结束分隔符 要使
sed-i的/[oldtext]/[newtext]/g'
还将替换我不希望的
[oldtext]
的部分匹配。\b在正则表达式中匹配单词边界(即第一个单词字符和非单词字符之间的位置):
对单词边界使用
\b
:
sed -i 's/\boldtext\b/newtext/g' <file>
sed-i's/\boldtext\b/newtext/g'
在我的一台机器中,用“\b
”(不带引号)分隔单词不起作用。解决方案是使用“\
”作为结束分隔符
要使用的示例进行解释,请执行以下操作:
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
$echo“酒吧禁运”| sed“s/\/no bar/g”
禁止酒吧禁运
$echo“bar embarassment”| awk'{for(o=1;o在Mac OS X上,这两个正则表达式语法都不能在sed内部用于匹配整个单词
\bmyWord\b
\
现在请听我说,稍后请相信我,您需要使用这种难看的语法:
/[[::]]/
因此,举例来说,用minty代替mint仅用于整词:
sed“s/[[::]/minty/g”
来源:在shell命令中:
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
或:
echo“bar embarassment”sed“s/\/no bar/g”
但是,如果您在vim中,则只能使用后者:
:% s/\<old\>/new/g
:%s/\/new/g
只需安装GNUsed
(以及其他所有GNU工具)通过MacPorts或Homebrew,并确保它在您的路径中处于第一位。
。使Mac相当可用是可能的。@JimStewart是一个很好的方法,可以打破一堆假定“在OS X上时,像OS Xers那样做”的工具。也就是说,我可以明确建议brew安装coreutils
,它是所有gnu工具的前缀。brew install gnu sed
使用gsed
回答了我自己的问题。有一个包列表@使用perl总是一个更好的解决方案:perl-pe的|\bone\b | two | g'
。当sed在这里或那里失败时,它可以稳定工作。小心[/code>:o,l
-->[newtext]
。您显然是指sed-i的/\boldtext\b/newtext/g'
OP明确指出“使用sed”这是一个拆分操作连接,而不是纯粹的替换;这将多个空格折叠为一个,并丢弃任何前导/尾随空格:例如,echo“bar embarassment”| awk'{(o=1;o|OK@OlegMazko我还来寻找在vim中使用posix可接受的方法,对我有效的方法是s/\谢谢你,我正在疯狂地尝试替换单词“and”,所以\band\b
挽救了这一天:)将使用[:space:][word[:space:]
被认为是可接受的@jimh对我不起作用。可能是CentOS 7OP上默认的不同版本的sed?直接要求sed
,因此vim
中关于用法的评论没有用。
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
:% s/\<old\>/new/g