【问题标题】:How to search and replace long HTML in multiple files on Linux如何在 Linux 上搜索和替换多个文件中的长 HTML
【发布时间】:2021-10-20 01:23:42
【问题描述】:

我需要用这个 HTML 递归查找所有文件:

<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>
    <meta charset="utf-8">
    <meta name="google" value="notranslate">

并用这个 HTML 替换它:

<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>
    <meta charset="utf-8">
    <meta name="google" value="notranslate">
    <meta name="format-detection" content="telephone=no">
    <meta name="format-detection" content="date=no">
    <meta name="format-detection" content="address=no">
    <meta name="format-detection" content="email=no">

这是我将 grep 命令通过管道传输到 sed 的失败尝试:

grep --include="index.html" -PRwzl -e '<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>\n    <meta charset="utf-8">\n    <meta name="google" value="notranslate">\n' | xargs -i@ sed -i 's/<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>\n    <meta charset="utf-8">\n    <meta name="google" value="notranslate">\n/<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>\n    <meta charset="utf-8">\n    <meta name="google" value="notranslate">\n    <meta name="google" value="notranslate">\n    <meta name="format-detection" content="telephone=no">\n    <meta name="format-detection" content="date=no">\n    <meta name="format-detection" content="address=no">\n    <meta name="format-detection" content="email=no">\n/g' @

单独的 grep 命令可以完美运行。

为清楚起见,这里将命令分成许多部分。:

grep --include="index.html" \
    -PRwzl \
    -e '<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>
        \n    <meta charset="utf-8">
        \n    <meta name="google" value="notranslate">
        \n' \
    | xargs -i@ sed -i 's/<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>
                            \n    <meta charset="utf-8">
                            \n    <meta name="google" value="notranslate">
                            \n
                        /<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>
                            \n    <meta charset="utf-8">
                            \n    <meta name="google" value="notranslate">
                            \n    <meta name="google" value="notranslate">
                            \n    <meta name="format-detection" content="telephone=no">
                            \n    <meta name="format-detection" content="date=no">
                            \n    <meta name="format-detection" content="address=no">
                            \n    <meta name="format-detection" content="email=no">
                            \n
                        /g' @
                        

【问题讨论】:

  • 您的尝试是 grep 命令,您声称该命令不成功但运行良好?澄清。
  • @Nic3500 我的尝试是将 grep 命令通过管道传送到 sed 命令。单独的 grep 命令可以正常工作。

标签: linux sed grep


【解决方案1】:

您的命令非常复杂,没有任何意义。您可以在文件上运行您的sed,而不需要之前的grepxargs。通常使用sed 对文件进行内联编辑如下所示:

sed -i 's/TO_FIND/REPLACE/' FILE.txt

另一条评论,sed 不是编辑 HTML 的好工具。看RegEx match open tags except XHTML self-contained tags

话虽如此,我建议这个脚本来满足你的要求。

#!/bin/bash
#
find . -type f -name "*.html" -print0 | while IFS= read -r -d '' file
do
    if [[ $(grep -c 'id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"' $file) -ne 0 ]]
    then
        # Add the content...
        echo "Adding in file $file"
        sed -i 's#</head>#    <meta name="format-detection" content="telephone=no">\n    <meta name="format-detection" content="date=no">\n    <meta name="format-detection" content="address=no">\n    <meta name="format-detection" content="email=no">\n    </head>#' "$file"
    else
        echo "Nothing to do on $file"
    fi
done
  • findwhileread 一起使用可以覆盖子目录中有HTML 文件的情况。
  • grep 已高度简化。如果存在 id 和 class 值,则足以识别有效文件。
  • 然后在sed 中添加新行即可。您的 sed 用这些相同的行替换了行。
  • 我在sed 中使用# 作为分隔符,而不是/,以避免与HTML 代码混淆。
  • 这是基于我自己创建的文件,因为您没有提供示例。您应该在问题中提供示例。
  • &lt;head&gt; 部分中的标签顺序不相关,因此在结束 &lt;/head&gt; 之前添加行有效。
  • 显然else 部分是可选的。
  • &lt;opinion&gt;我发现这种类型的脚本在未来比长单行更容易理解和调试。&lt;/opinion&gt;

假设 index.html 是:

<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>
    <meta charset="utf-8">
    <meta name="google" value="notranslate">
    <title>TITRE</title>
</head>
    <body>
        <p>PARAGRAPH</p>
    </body>
</html>

结果是:

<html id="blx-5fb3c619e82a2863d6567c52-000000001" class="blx-5fb3c619e82a2863d6567c52"><head>
    <meta charset="utf-8">
    <meta name="google" value="notranslate">
    <title>TITRE</title>
    <meta name="format-detection" content="telephone=no">
    <meta name="format-detection" content="date=no">
    <meta name="format-detection" content="address=no">
    <meta name="format-detection" content="email=no">
    </head>
    <body>
        <p>PARAGRAPH</p>
    </body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 2012-03-31
    • 1970-01-01
    • 2016-01-14
    • 2017-11-12
    • 1970-01-01
    • 2012-12-25
    • 2021-01-18
    相关资源
    最近更新 更多