【问题标题】:unix scripting error with sed commandsed 命令的 unix 脚本错误
【发布时间】:2017-12-21 15:33:06
【问题描述】:

我使用以下命令将“mppu”一词替换为“hihi”,它工作正常。

sed 's/mppu/'`echo "hihi"`'/' memo.cir

但是当我尝试下面的命令时

sed 's/mppu/'`echo "hi hi"`'/' memo.cir 

然后它给出错误

sed: -e expression #1, char 9: unterminated `s' command.

我真的不明白为什么它会给出这样的错误,因为我只是在 hihi 中添加了一个空格

【问题讨论】:

    标签: bash unix sed scripting


    【解决方案1】:

    正确的语法如下。

    解决方案一:用于简单的字符串替换。

    sed 's/old_text/new_text/' Input_file
    

    你不需要提到 echo 和所有那里。

    解决方案 2: 如果您想搜索一个字符串,然后替换任何字符串,那么下面的内容可能会对您有所帮助。

    sed '/look_for_string/s/old_text/new_test/' Input_file
    

    解决方案 3: 如果您想将任何字符串的多次/所有出现更改为一行,那么在命令的最后添加 g 也可以帮助您。

    sed '/look_for_string/s/old_text/new_text/g'  Input_file
    

    第 4 种解决方案:如果您想对 Input_file 本身进行更改,那么以下内容可能会对您有所帮助。

    sed -i '/look_for_string/s/old_text/new_text/g'  Input_file
    

    EDIT1:根据 OP,代码应将变量的值替换为行,然后以下可能会帮助您。

    VAL="SINGH"
    sed 's/tools/'"$VAL"'/'  Input_file
    

    EDIT2: 为 OP 添加一个示例,用于在匹配字符串时替换字符串的第 n 个数字。 假设以下是我的 Input_file。

    cat Input_file
    31116441
    AAA,hi,hi,hi,hji
    AAA
    AA
    BBB
    BB
    

    现在用第 3 次出现的 string(hi) 代替由 AAA 星标的行,我们可以按照下面的方法进行。

    sed '/AAA/s/hi/cha_cha_ch_ch_cha/3' Input_file
    31116441
    AAA,hi,hi,cha_cha_ch_ch_cha,hji
    AAA
    AA
    BBB
    BB
    

    【讨论】:

    • 这是一个示例,但在我的代码中,我将从另一个命令获取替换文本,如果替换文本包含空格,该命令也会给出相同的错误。但是下面的命令完全可以正常工作。 sed 's/mppu/this is the replacement text/' memo.cir
    • 您的意思是从您要替换的变量值?你能确认一下吗?
    • 不是变量值,但它是另一个命令,它为“mppu”提供替换文本,但是是的,我可以将它存储在变量中并使用变量来替换,但这也不起作用。
    • 检查我的 EDIT1,我的变量正在替换 Input_file 中的字符串工具,您可以将命令的值放入变量中,然后用所需的字符串更改“工具”并试一试,让我知道它是怎么回事。
    • 酷,乐于助人。您可以在此处通过投票选项鼓励人们,并可以从此处选择一个正确的答案(最适合您的要求)。继续学习,继续发帖,继续分享知识,干杯。
    【解决方案2】:

    您需要引用外部命令的输出。 set -x 帮助调试出了什么问题。

    $ set -x
    # can also use: echo 'asd mppu foo' | sed 's/mppu/'"`echo "hi hi"`"'/'
    $ echo 'asd mppu foo' | sed 's/mppu/'"$(echo "hi hi")"'/'
    + echo 'asd mppu foo'
    ++ echo 'hi hi'
    + sed 's/mppu/hi hi/'
    asd hi hi foo
    

    您可以看到hi hi 在外部单引号内。没有双引号,你会得到

    $ echo 'asd mppu foo' | sed 's/mppu/'`echo "hi hi"`'/'
    + echo 'asd mppu foo'
    ++ echo 'hi hi'
    + sed s/mppu/hi hi/
    sed: -e expression #1, char 9: unterminated `s' command
    


    同样,换行符会导致问题

    $ echo 'asd mppu foo' | sed 's/mppu/'"$(printf "hi hi\nabc")"'/'
    + echo 'asd mppu foo'
    ++ printf 'hi hi\nabc'
    + sed 's/mppu/hi hi
    abc/'
    sed: -e expression #1, char 12: unterminated `s' command
    

    用变量代替外部命令:

    $ r='hi hi'
    $ echo 'asd mppu foo' | sed 's/mppu/'"$r"'/'
    + echo 'asd mppu foo'
    + sed 's/mppu/hi hi/'
    asd hi hi foo
    $ echo 'asd mppu foo' | sed 's/mppu/'$r'/'
    + sed s/mppu/hi hi/
    sed: -e expression #1, char 9: unterminated `s' command
    + echo 'asd mppu foo'
    

    有关此主题的更多详细信息,请参阅Why does my shell script choke on whitespace or other special characters?

    【讨论】:

      【解决方案3】:

      你可以使用

      sed 's/old/new/g' file
      

      如果要替换变量,可以使用以下两种方法

      sed -i 's/XXXXX/${WEEK_DAY}/g' ==> sed -i "s/XXXXX/${WEEK_DAY}/g"
      sed -i 's/XXXXX/${WEEK_DAY}/g' ==> sed -i 's/XXXXX/'${WEEK_DAY}'/g'
      

      【讨论】:

      • 需要引用变量替换,看WEEK_DAY='hi hi'; echo 'XXXXX' | sed 's/XXXXX/'${WEEK_DAY}'/g'WEEK_DAY='hi hi'; echo 'XXXXX' | sed 's/XXXXX/'"${WEEK_DAY}"'/g'的区别
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2015-08-02
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      相关资源
      最近更新 更多