【问题标题】:sed command in ubuntuubuntu 中的 sed 命令
【发布时间】:2015-03-16 15:00:45
【问题描述】:

我想找到连接到机器的设备的 USB 端口。我用了命令

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

我想用这个输出替换文件的值。所以我使用了 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 expression #1, char 46: unterminated `s' command

帮我解决这个问题。

提前谢谢你。

【问题讨论】:

  • 看起来您正在使用双引号将参数分隔到 sed 并且还在表达式中使用双引号。
  • 尝试转义双引号
  • 提供您的示例输入文件和预期输出。

标签: bash shell sed


【解决方案1】:

替换:

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' ' ' 去掉换行符。

其他四个 cmets:

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

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

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

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

    SERIAL_INTERFACE=ttyUSB0 ttyUSB1
    

    由于你没有说你想要的输出是什么,我不知道这是否是你想要的。

为什么会出现“未终止的s 命令”错误?

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

$ echo "$string"
a
b

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

$ 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 命令时,必须非常小心。

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 2023-03-30
    • 2018-03-26
    • 2012-09-14
    • 2014-12-07
    • 2023-03-31
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多