Sed错误" sed:无与伦比的' /'"

时间:2014-07-31 11:03:28

标签: linux bash shell sed

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

{"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变量包含/ ==&gt; "0/2"

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

4 个答案:

答案 0 :(得分:7)

您的$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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

这只能在包含字符串(不是正则表达式)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