ubuntu 中的 sed 命令

sed command in ubuntu

我想找到连接到本机的设备的USB PORT。我使用了命令

dmseg | grep "ttyUSB" | grep "attached"

我得到的输出是

[  525.763315] usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0
[  525.796039] usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB1

但我只需要端口。所以我使用了命令

cut -d ' ' -f14

我得到了

ttyUSB0
ttyUSB1

我想用这个替换文件的值output.So我使用了 se 命令

sed -i "s/\b\SERIAL_INTERFACE=\b.*/SERIAL_INTERFACE=$(dmesg | grep "ttyUSB" | grep "attached" | cut -d ' ' -f13)/g" /home/ubuntu/webserver/properties.cfg

但是显示错误 sed:-e 表达式 #1,字符 46:未终止的“s”命令

帮我弄清楚这个。

提前致谢。

替换:

sed -i "s/\b\SERIAL_INTERFACE=\b.*/SERIAL_INTERFACE=$(dmesg | grep "ttyUSB" | grep "attached" | cut -d ' ' -f13)/g" /home/ubuntu/webserver/properties.cfg

与:

sed -i "s/\bSERIAL_INTERFACE=\b.*/SERIAL_INTERFACE=$(dmesg | grep "ttyUSB" | grep "attached" | cut -d ' ' -f14| tr '\n' ' ' | tee save.tmp)/g" /home/ubuntu/webserver

问题是管道产生了多个输出行。解决方案是添加 tr '\n' ' ' 以删除换行符。

另外四个评论:

  • SERIAL_INTERFACE 中的 S 无缘无故被转义。我删除了那个转义符。

  • 您使用命令 cut -d ' ' -f14 报告成功,但管道命令使用 cut -d ' ' -f13.

  • 如评论中所述,引号中确实有引号,但这很好:内引号在 $(...) 内,因此不会干扰外引号。

  • 此命令的输出如下所示:

    SERIAL_INTERFACE=ttyUSB0 ttyUSB1
    

    因为你没有说你想要的输出是什么,我不知道这是不是你想要的。

为什么 "unterminated s command" 错误?

假设我们有一个包含换行符的 shell 变量:

$ echo "$string"
a
b

当您将此变量替换为 sed 命令时,sed 将换行符视为终止命令的行的终止符。结果是 "unterminated s command":

$ echo hi | sed "s/hi/$string"
sed: -e expression #1, char 6: unterminated `s' command

相比之下,没有换行符,它工作正常:

$ string="a b"
$ echo hi | sed "s/hi/$string/"
a b

综上所述,将shell变量代入sed命令时,必须非常小心。