如何使用标准 unix 命令将后缀附加到 HTML 文件中的 id?

Posted

技术标签:

【中文标题】如何使用标准 unix 命令将后缀附加到 HTML 文件中的 id?【英文标题】:How do I append a suffix to ids in a HTML file using standard unix commands? 【发布时间】:2021-12-29 11:00:13 【问题描述】:

假设我有一个这样的 html 文件:

<body>
    <div id="a">
       content of div a
       <div id="b"> content of div b </div>
       <div id="c"> content of div c </div>
    </div>
    <style>
      #a color: red; 
      #b color: green; 
      #c color: blue; 
    </style>
</body>

我想为所有 id 附加一个唯一的后缀(例如,-suffix),其中包括属性id="..." 和选择器#...,并生成如下文件:

<body>
    <div id="a-suffix">
       content of div a
       <div id="b-suffix"> content of div b </div>
       <div id="c-suffix"> content of div c </div>
    </div>
    <style>
      #a-suffix color: red; 
      #b-suffix color: green; 
      #c-suffix color: blue; 
    </style>
</body>

如何使用标准的 unix shell 工具(如 sedgrepawk)以涵盖尽可能多的情况的方式完成此任务?

我的尝试:

我想出了以下sed 命令:

sed -e 's/id="\([-_a-zA-Z0-9]*\)"/id="\1-suffix"/g;s/#\([-_a-zA-Z0-9]*\)/#\1-suffix/g' index.html

实际上是两个命令合二为一:

s/id="\([-_a-zA-Z0-9]*\)"/id="\1-suffix"/g - 替换 id 属性 id="..." s/#\(\[-_a-zA-Z0-9]*\)/#\1-suffix/g - 替换 id 选择器 #...

然而它远非完美。首先,它只支持双引号 id="..." 中的双属性值,并且 id 值受到限制,因为它们必须匹配 [-_a-zA-Z0-9]*。其次,这与十六进制颜色冲突,所以像#ffffff 这样的白色会得到一个后缀#ffffff-suffix;像 #... 这样的 id 选择器应该只在存在适当的属性 id="..." 时才获得后缀。

最好的方法是什么?

【问题讨论】:

我建议使用xmlstarlet。 为避免与十六进制颜色发生冲突,您可以尝试匹配行首、一些空格,然后是 id。 s/^[ \t]*#\([-_a-zA-Z0-9]*\)/#\1-suffix/g。 (注意:我没有测试过这个正则表达式。) 【参考方案1】:

您的文件中有很多案例,正如您提到的颜色问题 我的方法是使用

逐行处理文件
cat inputfile.html | while read a; do
some code
echo "$a" >> outputfile.html
done

话虽如此,你可以使用

b=$(expr "$a" : "regex")

要精确过滤您要修改的内容,然后再使用一些

sed

在 $b 上得到你想要的并将 $b 推入 $a

【讨论】:

以上是关于如何使用标准 unix 命令将后缀附加到 HTML 文件中的 id?的主要内容,如果未能解决你的问题,请参考以下文章

Linux tar 命令用法整理

如何将UNIX风格时间转换为标准格式

如何跨(计算)节点使用 unix 管道?

如何将标准输入重定向到 Windows 命令行中的文件?

通过附加 .html 后缀重写 URL

如何使用 Unix(或 Windows)中的(最好是未命名的)管道将一个进程的标准输出发送到多个进程?