Gnu Sed:空格字符类与行尾字符不匹配

Gnu Sed:空格字符类与行尾字符不匹配

模式:abc 后跟空格或者是一行中的最后一个字符。

orig="abc[[:space:]]+";
new=Hello
sed -i -r -e "s|${orig}|${new}|g" ./file ;

文件:

abc
abcd
abc

abc d

执行后:

abc
abcd
abc

Hellod

预期输出:

Hello
abcd
Hello

Hello d

我缺少什么?


注意:我想保留空格字符。

答案1

如果你想要的是保留空间:

注意:我想保留空格字符。

然后,匹配它们,但在替换时恢复它们:

 orig='abc([[:space:]]+)'
 new='Hello\1'
 sed -E -e "s|${orig}|${new}|g" ./infile ;

这将生成以下输出(要就地修改添加适当的-i选项):

 Hello  
 abcd  
 Hello   

 Hello d

当然,这是假设文件的某些行末尾有一些空格:

 $ cat infile | sed -n l
 abc  $
 abcd  $
 abc   $
 $
 abc d$

如果您还需要正则表达式匹配不以空格结尾的行,则需要更复杂的正则表达式:

 orig='abc([[:space:]]+|$)';
 new='Hello\1';
 sed -E -e "s,${orig},${new},g" ./infile ;

当然,s|||必须更改分隔符,以s,,,避免与|正则表达式所需的替代项发生冲突。

答案2

无需匹配、捕获然后重新插入空格,只需查找“abc”作为独立词。对于 GNU sed,使用\<and\>作为单词边界:

sed 's/\<abc\>/Hello/g' file
Hello
abcd
Hello

Hello d

如果您想将模式和替换放入变量中,您只需小心地适当引用反斜杠即可。

pattern="\\<abc\\>"    # or: pattern='\<abc\>'
replacement=Hello
sed "s/$pattern/$replacement/" file

相关内容