Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell sed全词搜索和替换_Shell_Sed - Fatal编程技术网

Shell 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搜索和替换整个单词

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

只需安装GNU
sed
(以及其他所有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