模式: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