[英]Sed error "sed: unmatched '/'"
我有一個包含以下格式數據的文件:
{"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 命令以使其工作?
您的$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
檢查您的$param
或$line
變量是否有\\n
(換行符),在我的情況下,這就是錯誤的原因。
當我在 ansible 任務中使用 sed -i.bak 's/\\r$//' 命令時,我遇到了同樣的錯誤。 我通過簡單地轉義“\\r”中的“\\”來解決它。 我將命令更改為sed -i.bak 's/\\\\r$//'
這將穩健地僅在包含字符串(不是正則表達式) 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.