我有一个包含以下格式数据的文件:
{"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命令以使其正常工作?
答案 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
并且不会受到param
或line
中除反斜杠以外的任何字符的影响。如果您需要能够按原样处理反斜杠,则只需将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