【问题标题】:How do I fix this sed problem with unterminated lines?如何使用未终止的行解决此 sed 问题?
【发布时间】:2010-12-12 13:08:24
【问题描述】:

我猜这一定是一个逃避问题,但我找不到。最令人沮丧的是,这是基于我使用的旧的sed 脚本,那么为什么一年后我尝试重新使用它时不能让它工作呢? ;)

框架:

我有一个文件,其中包含所有需要相同的文件名列表 搜索和替换的 HTML 字符串。

我需要更换

 <a href="foo.html">Foo</a>

<a href="foo.html">Foo</a><a href="bar.html">Bar</a>

我正在使用:

#!/bin/bash
for i in $(cat sourcelist); do cat $i | sed 's,<a href="foo.html">Foo</a>,<a href="foo.html">Foo</a><a href="bar.html">Bar</a>,g'  > $i.bak ; mv $i.bak $i ; done
#end

但我收到 sed 错误“未终止的 `s' 命令”。

我已经尝试转义双引号、斜杠,但仍然无法解析。

已经很晚了,我正在失去注意力。有什么锐利的眼睛可以捕捉到我错过的东西吗?

【问题讨论】:

  • 它运行得很好。您是完全按照上面的方式进行替换,还是只是 foo 和 bar 的示例(也许您在某处有一个额外的逗号?)
  • 与其尝试逃避事物,不如尝试消除它们?尝试使用 BAR 作为替换文本,单独匹配第一个标签,单独匹配“foo.html”,单独匹配 .html。简化直到 sed 停止抱怨,然后查看问题所在。
  • 好点 Beta,一次性解决所有问题并不总是最好的主意。 :)

标签: bash unix scripting sed


【解决方案1】:

由于空间问题,尽量不要对这样的猫使用 for 循环。还有,要 sed 的 cat 也没用。

while read -r line
do
    sed 's,<a href=\"foo.html\">Foo</a>,<a href=\"foo.html\">Foo</a><a href=\"bar.html\">Bar</a>,g' "${line}" > "${line}.bak"
    mv "${line}.bak" "${line}"
done < sourcelist

当然,如果您使用的是 GNU sed,可以使用 -i 选项为您创建备份。

【讨论】:

    【解决方案2】:

    通过在 for 中运行 Amro 的 while 循环来修复它:

    #!/bin/bash
    
    for i in $(cat sourcelist); do
    
    while read  line
    do
        sed 's,<a href=\"foo.html\">FOO</a>,<a href=\"foo.html\">FOO</a>
        <a href=\"bar.html\">Bar</a>,g'
            done < $i > $i.bak ; mv $i.bak $i ; done
    

    可能不是最优雅的,但它确实有效。

    干杯。

    【讨论】:

    • 为什么要取出两个不同的ID?
    • 首先,这并不是我真正的解决方案,我只是添加了一个修复程序。其次,我们假设sourcelist 文件每行包含一个文件名。使用while循环的原因是为了避免文件名中的空格问题。你上面的代码对我没有意义?
    • sourcelist 是每行一个文件名,您是正确的 Amro。文件中的读取行没有按预期工作,所以我想我会将它填充为一个变量,看看它是否有效。我没有知识水平来解释它,只能说在这个给出的所有例子中都是有效的。 ;)
    【解决方案3】:

    您是否尝试过转义引号?例如:

    #!/bin/bash
    for i in $(cat sourcelist); do cat $i | sed 's,<a href=\"foo.html\">Foo</a>,<a href=\"foo.html\">Foo</a><a href=\"bar.html\">Bar</a>,g'  > $i.bak ; mv $i.bak $i ; done
    #end
    

    【讨论】:

    • 这里的双引号不用转义
    猜你喜欢
    • 2020-06-15
    • 2018-01-02
    • 2020-03-12
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多