【问题标题】:sed returns "sed: command garbled"sed 返回“sed:命令乱码”
【发布时间】:2013-10-15 18:27:26
【问题描述】:

我在 file.txt 中有这些数据:

1234-abca-dgdsf-kds-2;abc dfsfds 2
123-abcdegfs-sdsd;dsfdsf dfd f
12523-cvjbsvndv-dvd-dvdv;dsfdsfpage

我想替换“-”之后的字符串,直到“;”只有“;”,所以我得到:

1234;abc dfsfds 2 
123;dsfdsf dfd f 
12523;dsfdsfpage

我尝试了以下命令:

sed -e "s/-.*;/;" file.txt

但它给了我以下错误:

sed 命令乱码

为什么会这样?

【问题讨论】:

  • 我在 2017 年收到一条更具表现力的错误消息:sed: -e expression #1, char 8: unterminated s' command`
  • @AnthonySottile 这可能是在 Solaris 中运行的。我是从Sed command garbled on Solaris来到这里的

标签: linux bash sed replace


【解决方案1】:

sed替换命令定义为(source):

's/REGEXP/REPLACEMENT/[FLAGS]'

(substitute) 将正则表达式与模式空间的内容进行匹配。如果找到,将匹配的字符串替换为 REPLACEMENT。

但是,你是说:

sed "s/-.*;/;"

即:

sed "s/REGEXP/REPLACEMENT"

因此在表达式末尾缺少一个“/”。只需添加即可:

sed "s/-.*;/;/"
#            ^

【讨论】:

  • 您解释问题时的出色答案!
【解决方案2】:

sed 命令末尾缺少斜杠:

应该是"s/-.*;/;/"

【讨论】:

    【解决方案3】:

    -.* 这里是* 贪心,所以如果有多个;,这将失败

    echo "12523-cvjbsvndv-dvd-dvdv;dsfdsfpage;test" | sed -e "s/-.*;/;/"
    12523;test
    

    更改为-[^;]*

    echo "12523-cvjbsvndv-dvd-dvdv;dsfdsfpage;test" | sed -e "s/-[^;]*;/;/"
    12523;dsfdsfpage;test
    

    【讨论】:

      【解决方案4】:

      这应该可行:

      sed 's/-.*;/;/g' file > newFile
      

      【讨论】:

        猜你喜欢
        • 2015-07-05
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多