Sed错误:替换表达式中的选项有误

15

我有一个配置文件(gpsd.default),其中包含以下格式的数据:

# If you must specify a non-NMEA driver, uncomment and modify the next line     
GPSD_SOCKET="/var/run/gpsd.sock"                                                
GPSD_OPTIONS=""                                                                
GPS_DEVICES="" 

我正在使用sed命令修改文件:

sed -i 's/^GPS_DEVICES="".*/GPS_DEVICES="dev/ttyUSB1"/' /etc/default/gpsd.default
or 
sed -i '4s/^.*/GPS_DEVICES="dev/ttyUSB1"/' /etc/default/gpsd.default

上述sed命令返回错误:

sed: 在替换表达式中存在错误选项

因为新行中的表达式包含"/"。

如何更新我的sed命令,使其能够正常工作?


“/” 不是你唯一可能遇到的问题,请参考 https://dev59.com/ul0b5IYBdhLWcg3wGN0s#29626460。 - Ed Morton
2个回答

42

原因是您使用的正则表达式包含/,这也是sed用作分隔符的相同字符。

只需将sed分隔符更改为另一个,例如

sed -i 's~^GPS_DEVICES="".*~GPS_DEVICES="dev/ttyUSB1"~' /etc/default/gpsd.default

顺便提一下,因为你要更改 /etc 中的文件,建议使用 -i.bak 选项备份原始文件。这是防止重要信息丢失的好习惯。


如果它被用作名词,那么它就是实践 :) - user4453924
1
@fedorqui 你可以像这样转义 /,使用 \/ - Jahid
1
@Jahid 是的,没错,但是使用其他分隔符更加整洁。 - fedorqui
针对这种特殊情况,是的,但如果您想匹配 ~,该怎么办? - Jahid
@Jahid,对于这个问题没有确定的解决方案。无论是转义还是使用另一个分隔符都不能解决所有情况,因此需要根据每种情况选择最适合的方法。 - fedorqui

4

你应该将sed命令更新为这样的命令。

sed -i 's/^GPS_DEVICES=\"\".*/GPS_DEVICES=\"dev\/ttyUSB1\"/' /etc/default/gpsd.default

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接