在使用sed时寻找匹配的'''时出现意外的EOF

时间:2014-07-10 10:03:18

标签: bash sed sh

是的,这个问题已被多次询问,并在答案中告诉我们\在单引号之前转义字符。

在下面的代码中,它不起作用:

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

3 个答案:

答案 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//,/\',\'}"