【问题标题】:unexpected EOF while looking for matching `'' while using sed使用 sed 时寻找匹配的“”时出现意外的 EOF
【发布时间】:2014-08-31 15:51:08
【问题描述】:

是的,这个问题已经被问过很多次了,在回答中对我们说\单引号前的转义字符。

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

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

【问题讨论】:

  • 不要使用旧的和过时的反引号,使用括号var=$(code)。并且总是双引号变量echo "$LIST"(可以不对单行变量双引号,但这不是一个好习惯)

标签: bash sed sh


【解决方案1】:

考虑

LIST="$(sed "s/,/\',\'/g" <<< "$LIST")"

但第一个和最后一个元素可能不会被完全引用,因为缺少前导和尾随逗号

顺便说一句,你不需要对 sed 进行 subshel​​l - 字符串匹配和替换完全在 bash 的能力范围内:

LIST="${LIST//,/\',\'}"

【讨论】:

  • 这只是 Avinashs 帖子的副本,同样的 sed 只是移动了输入。并且第一个元素没有被引用..
  • 它可以是重复回复,但 +1 用于提及使用&lt;&lt;&lt; "$LIST"
  • 应该是一个编辑而不是一个新的答案。此外,如果不清楚,Deleted User 实际上并不是已删除的用户。
【解决方案2】:

您可以使用awk

echo $LIST
(96634,IV14075295,TR14075685')

LIST=$(awk '{gsub(/,/,q"&"q)};gsub(/\(/,"&"q)1' q="'" <<< $LIST)

echo $LIST
('96634','IV14075295','TR14075685')

为了防止单引号出现问题,我只是将其设置为 awk 变量。

【讨论】:

    【解决方案3】:

    在 sed 命令中使用双引号代替单引号,并删除最后一个反引号之前的空格。如果 sed 模式中存在单引号,则使用替代的封闭引号(即双引号),

    sed "s/,/\',\'/g"
    

    这条线是,

    LIST=$(echo $LIST | sed "s/,/\',\'/g")
    

    不要在 sripts 中使用反引号而不是反引号,使用 $()

    【讨论】:

    • 但我的问题是为什么转义字符不能使用单引号:)
    • 不要使用旧的和过时的反引号,使用这样的括号:LIST=$(echo "$LIST" | sed "s/,/\',\'/g")。和双引号变量以保留新行等。
    • @Bharat 你可以通过运行echo '\''echo '\' 这两个命令来看到区别。 Sed 使用基本正则表达式。第一个 echo 命令不起作用,因为解释器在看到第二个 ' 后,将其视为字符串结尾,而第二个 ' 之前的转义字符被视为文字。同样的操作也在 sed 上完成。
    • @AvinashRaj 确实如此,但我使用管道将 echo 的输出重定向到 sed ,我没有在 echo 中使用任何转义字符。
    • 我的意思是上面评论中的回显命令,而不是你问题中的那个。
    猜你喜欢
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多