【问题标题】:Sed error "sed: unmatched '/'"sed 错误“sed:不匹配的'/'”
【发布时间】:2014-07-31 11:03:27
【问题描述】:

我有一个包含以下格式数据的文件:

{"parameter":"toto.tata.titi", "value":"0/2", "notif":"1"}

我使用 sed 对文件进行了更改:

sed -i "/\<$param\>/s/.*/$line/" myfile

line 是哪个变量

{"parameter":"toto.tata.titi", "value":"0/2", "notif":"3"}

param 变量是toto.tata.titi

上述sed命令返回错误:

sed: unmatched '/'

因为line 变量包含/ ==> "0/2"

即使line 变量包含/,如何更新我的sed 命令以使其正常工作?

【问题讨论】:

  • 只需使用另一个 sed 分隔符,因为您的变量包含一个。这是重复的!

标签: linux bash shell sed


【解决方案1】:

您的 $param$line 可能包含 / 导致 sed 出现语法错误。考虑使用其他分隔符,例如 |@

例子:

sed -i "/\<$param\>/s|.*|$line|" myfile

但这可能还不够。您还可以在扩展时引用斜杠:

sed -i "/\<${param//\//\\/}\>/s|.*|$line|" myfile

也可以使用其他更安全的字符:

d=$'\xFF'  ## Or d=$(printf '\xFF') which is compatible in many shells.
sed -i "/\<${param//\//\\/}\>/s${d}.*${d}${line}${d}" myfile

【讨论】:

  • 尖括号(&lt; &gt;)需要转义吗? ${param//\//\\/} 到底做了什么?
  • @skamazin 可能不需要转义它们,因为它们不是正则表达式的特殊字符。它将 $param 中的所有 / 更改为 \/
  • 那么,您将这种编辑变量的方法称为什么?我想做一些研究,因为我以前见过这种语法一次,它似乎真的很有用,虽然很神秘
  • 这只是参数扩展的一种方法,在 Bash 的手册等手册中有很好的解释。见Shell Parameter Expansion。它们可能是神秘的,但我们总是通过echo 得到我们想要的结果——首先处理我们的行,然后像echo sed -i "/\&lt;${param//\//\\/}\&gt;/s${d}.*${d}${line}${d}" myfile 一样处理它们。毕竟我们关心的只是命令的最终形式。
  • 你应该在你的回答中注意到像$'\xFF'这样的结构是仅限于bash的(因为这个问题也被标记为shell),并且不会在其他shell,甚至在以 /bin/sh 运行时在 bash 中。
【解决方案2】:

检查您的$param$line 变量是否有\n(换行符),在我的情况下,这是错误的原因。

【讨论】:

    【解决方案3】:

    当我在我的 ansible 任务中使用 sed -i.bak 's/\r$//' 命令时,我遇到了同样的错误。我通过简单地转义'\r'中的'\'来解决它。我把命令改成了sed -i.bak 's/\\r$//'

    【讨论】:

      【解决方案4】:

      这将仅在包含 字符串(不是正则表达式)toto.tata.titi:

      的行上运行
      awk -v param="$param" -v line="$line" 'index($0,param){$0 = line} 1' file
      

      并且不受paramline 中除反斜杠之外的任何字符的影响。如果您需要能够按原样处理反斜杠,只需将 shell 变量移动到文件名列表中,并在 BEGIN 部​​分中从它们中填充 awk 变量,而不是通过 -v 赋值:

      awk 'BEGIN{param=ARGV[1]; line=ARGV[2]; ARGV[1]=ARGV[2]=""} index($0,param){$0 = line} 1' "$param" "$line" file
      

      【讨论】:

        猜你喜欢
        • 2016-01-28
        • 2021-05-23
        • 2013-04-04
        • 2022-01-12
        • 2014-04-22
        • 2014-06-17
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        相关资源
        最近更新 更多