1

我有以下。我正在用克拉分隔的文本文件中的值替换 html 中的一些字段。

while  IFS=^ read col1 col2 col3 col4 col5 col6
do
    echo $col1
      echo "HtmlFor$col1" >> "SiteHtml.txt"
      cat $FILENAME1 | sed  "s/var1/$col1/" | sed  "s/var2/$col2/"| sed  "s/var3/$col3/" | sed  "s/var4/$col4/" | sed  "s/var5/$col5/" >> "SiteHtml.txt"
      # | sed  "s/var3/$col3/" | sed  "s/var4/$col4/" | sed  "s/var5/$col5/" | sed  "s/var6/$col6/"
done

如果列中有反斜杠,我会收到错误消息。如果我尝试用“/”转义它们,我仍然会收到错误消息。只有当我删除它们时它才有效,我不能这样做。我究竟做错了什么?

4

2 回答 2

0

您需要使用 3 个反斜杠来替换“sed”中的单个反斜杠。

例子:

echo "\\" | sed "s/\\\/replace/"

原因是:第一个 \ 在作为参数传递时转义第二个 \,并且一旦在二进制参数内部传递,将类似于“s/\/replace”,现在当程序解析字符串时,第二个 \ 转义第三个 \ 最终得到要替换为 '\' 的字符串。

可能会出现很多问题,因为 \ 可以逃脱。其中一件事情可能会困扰你。

  1. 当我们在字符串中使用它时,您的 '\' 位于c、n或任何其他有意义的特殊字符旁边
  2. 你 '\' 是字符串$col1变量的最后一个字符,当 sed 解析字符串时,它的含义被忽略了。

如果没有看到正在解析的 HTML,我不能说太多。

注意:这些不是唯一可能给您带来错误的事情,但您大致了解反斜杠如何影响 sed 中的字符串解析,并希望您能找到解决方案。

PS:希望您也知道,在双引号之间传递的任何内容在将其作为参数传递之前都会被 shell 的值替换,而在单引号之间传递的任何内容都不会被其值替换。

于 2012-12-20T18:31:18.103 回答
0

这是另一个版本:

echo "\\" | sed "s [\] replace "
于 2012-12-20T18:48:43.323 回答