请教, sed 替换匹配字符串,原来字符中含有符号,用转义不行?

2023-01-16 11:36:35 +08:00
 qazwsxkevin

举个例子:

/etc/passwd
root:x:0:0:root:/root:/bin/bash
改为:
root:x:0:0:root:/:/bin/bash

看 sed 教学和文档,理解上用
sed -i s/:root:/root:/:root:/:/g /etc/passwd
会提示字符有错误

如果必须用 sed 替换这样含有:,或者其他 ASCII 标点符号的字符串的操作,正确语法应该是什么?

1843 次点击
所在节点    Linux
7 条回复
rrfeng
2023-01-16 11:40:27 +08:00
sed -i s @/root@/@
ETiV
2023-01-16 11:43:44 +08:00
LS+1
简单说就是换一个文件里没有的标记符号,我习惯用单引号
simplereasy
2023-01-16 13:04:06 +08:00
sed -i 's/\/root:.\+/\/root:\/bin\/bash/g' /etc/passwd
simplereasy
2023-01-16 13:10:09 +08:00
应该是反斜杠转义
simplereasy
2023-01-16 13:13:34 +08:00
@simplereasy 我这是直接粘过来的,应该把后边的 root 去掉,也就是 sed -i 's/\/root:.\+/\/:\/bin\/bash/g' /etc/passwd
haffner
2023-01-16 14:39:32 +08:00
换个分隔符就行,把你的语句改成
sed -i s#:root:/root:#:root:/:#g /etc/passwd
bao3
2023-01-17 06:06:18 +08:00
换成是人在读,你遇到 一句指令里全是 / 你自己也困惑。
所以你用转义是没问题,问题是你应该转义的 / ,也就是应该 \/
当然 1# 同时解决了你分隔符和搜索逻辑的问题,是非常不错的解法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/909225

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX