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
命令时,必须非常小心。
我想找到连接到本机的设备的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
命令时,必须非常小心。