是的,这个问题已被多次询问,并在答案中告诉我们\
在单引号之前转义字符。
在下面的代码中,它不起作用:
LIST="(96634,IV14075295,TR14075685')"
LIST=`echo $LIST | sed 's/,/AAA/g' `
echo $LIST # Output: (96634AAAIV14075295AAATR14075685')
# Now i want to quote the list elements
LIST=`echo $LIST | sed 's/,/\',\'/g' ` # Giving error
# exit 0
错误:
line 7: unexpected EOF while looking for matching `''
line 8: syntax error: unexpected end of file
答案 0 :(得分:3)
而不是单引号,在sed命令中使用双引号,并在最后一次反引号之前删除空格。如果sed模式中存在单引号,则使用替代的封闭引号(即双引号),
sed "s/,/\',\'/g"
这条线就是,
LIST=$(echo $LIST | sed "s/,/\',\'/g")
请勿使用反手柄而不是bacticks,使用$()
答案 1 :(得分:1)
您可以使用awk
echo $LIST
(96634,IV14075295,TR14075685')
LIST=$(awk '{gsub(/,/,q"&"q)};gsub(/\(/,"&"q)1' q="'" <<< $LIST)
echo $LIST
('96634','IV14075295','TR14075685')
为了防止单引号出现问题,我只需将其设置为awk
变量。
答案 2 :(得分:0)
考虑
LIST="$(sed "s/,/\',\'/g" <<< "$LIST")"
但由于缺少前导和尾随逗号,第一个和最后一个元素可能无法完全引用
顺便说一下,你不需要为sed做个子shell - 字符串匹配和替换完全在bash的能力范围内:LIST="${LIST//,/\',\'}"