Sed - 查找和替换 html 代码中的文本(从一种语言到另一种语言)

Posted

技术标签:

【中文标题】Sed - 查找和替换 html 代码中的文本(从一种语言到另一种语言)【英文标题】:Sed - find and replace text in html code (from one language to another) 【发布时间】:2021-11-25 00:33:36 【问题描述】:

我有英文版的 html 文件 index.html。 我想再创建一个语言版本。我认为最好的方法是使用 sed。所以我想自动将语言版本更改为另一种语言版本并使用 sed 将其保存在新文件中。

例如我的索引:

    <section class="p-b-10">
    <div class="container">
    <div class="row">
    <div class="col-lg-6">
    <div class="heading-text heading-section">
    <h2>THE COMPANY</h2>
    <span class="lead">The most happiest eu, sodales vel dolor. </span>
    </div>
    </div>
    <div class="col-lg-6 m-t-60">
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="100" data-delay="100" data-type="%">
    <div class="progress-title">One Sun   </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="94" data-delay="200" data-type="%">
    <div class="progress-title">Two    </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="78" data-delay="300" data-type="%">
    <div class="progress-title">JQUERY    </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="65" data-delay="400" data-type="%">
    <div class="progress-title">Three | ok   </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="65" data-delay="400" data-type="%">
    <div class="progress-title">Three    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    </section>

Sed 应该在我的整个代码中查找并替换所有给定的英语单词以西班牙语。

公司(取代)Empresa

一个太阳(替换为)Uno Sol

两个(替换为)Dos

三个 |好的(替换为) Tres |好的

所以应该如下所示:

    <section class="p-b-10">
    <div class="container">
    <div class="row">
    <div class="col-lg-6">
    <div class="heading-text heading-section">
    <h2>Empresa    </h2>
    <span class="lead">The most happiest eu, sodales vel dolor.     
    </span>
    </div>
    </div>
    <div class="col-lg-6 m-t-60">
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="100" data-type="%">
    <div class="progress-title">Uno Sol       </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="94" data-type="%">
    <div class="progress-title">Dos    </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="78" data-type="%">
    <div class="progress-title">JQUERY    </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="65" data-type="%">
    <div class="progress-title">Tres | ok       </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="65" data-type="%">
    <div class="progress-title">Three    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    </section>

请帮忙! 谢谢你

【问题讨论】:

您是否可以访问 xmllint 或 xmlstarlet 等 xml 感知工具?如果是这样,请用那些标记您的问题以获得可靠的答案。 【参考方案1】:

我想再创建一个语言版本。

这称为Internationalization 或简称为 i18n。

我认为最好的方法是使用 sed。

最好是主观的,如果你不严格限制在 sedAWK 我建议尝试GNU gettext,因为它是为了提供 i18n。您需要更多时间才能开始,但从长远来看,您可能会获得更可靠的解决方案。

【讨论】:

【参考方案2】:

您可以根据提供的示例数据尝试此sed

sed -Ee '/h2/s/(.*>).*(<.*)/\1Empresa\2/' \
-e '/div class="progress-title"/s/(.*>.?*)One Sun(.?*<.*)/\1Uno Sol\2/' \
-e '/div class="progress-title"/s/(.*>.?*)Two(.?*<.*)/\1Dos\2/' \
-e '/div class="progress-title"/s/(.*>.?*)Three \| ok(.?*<.*)/\1Tres | ok\2/;' input_file

这将在匹配内容之前尝试匹配标签,同时考虑到标签内可能还有更多数据,而只针对要更改的单词。

或者作为一个班轮

sed -E '/h2/s/(.*>).*(<.*)/\1Empresa\2/;/div class="progress-title"/s/(.*>.?*)One Sun(.?*<.*)/\1Uno Sol\2/; /div class="progress-title"/s/(.*>.?*)Two(.?*<.*)/\1Dos\2/;/div class="progress-title"/s/(.*>.?*)Three \| ok(.?*<.*)/\1Tres | ok\2/;' input_file

输出

<section class="p-b-10">
    <div class="container">
    <div class="row">
    <div class="col-lg-6">
    <div class="heading-text heading-section">
    <h2>Empresa</h2>
    <span class="lead">The most happiest eu, sodales vel dolor. </span>
    </div>
    </div>
    <div class="col-lg-6 m-t-60">
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="100" data-delay="100" data-type="%">
    <div class="progress-title">Uno Sol   </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="94" data-delay="200" data-type="%">
    <div class="progress-title">Dos    </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="78" data-delay="300" data-type="%">
    <div class="progress-title">JQUERY    </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="65" data-delay="400" data-type="%">
    <div class="progress-title">Tres | ok   </div>
    </div>
    </div>
    <div class="p-progress-bar-container title-up small color">
    <div class="p-progress-bar" data-percent="65" data-delay="400" data-type="%">
    <div class="progress-title">Three    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    </section>

【讨论】:

【参考方案3】:

您可以像这样使用 sed:s/FIND/REPLACE/g 如果要运行多个 sed 命令,请使用 ; 运算符:

sed 's/The Company/Empresa/g; s/One Sun/Uno Sol/g; s/Two/Dos/g; s/Three | ok/Tres | ok/g' $YOUR_FILE > spanish.html

如果您不想替换所有单词而只替换第一个匹配项,请删除“g”。

【讨论】:

想想如果公司名称改为TwoBrothersOne Sunday 而不是Empresa 会怎样。这种方法非常脆弱。 @t 参数呢?它改变了什么?例如 sed 's/The Company/Empresa/g;t;

以上是关于Sed - 查找和替换 html 代码中的文本(从一种语言到另一种语言)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本

如何使用 sed 或 awk 正确查找和替换多行文本?

Bash:从脚本中查找并替换文本

根据文本文件的名称查找和替换文本文件中的单词

使用 grep 和 sed 在 shell 中查找和替换同一文件中的多行

awk && sed ====积累取ip以及sed 查找替换