如何使用 bash 和 sed 解析 html 标签属性

Igo*_*aic -2 bash parsing sed

我有几个包含具有唯一子字符串的行的文件NAME-

      <input type="hidden" name="NAME-00B5JZ" value="350.378,00">
       <input type="hidden" name="NAME-0599" value="0,00">
       <input type="hidden" name="NAME-7012" value="0,00">
       <input type="hidden" name="NAME-0096" value="0,00">
       <input type="hidden" name="NAME-0433" value="0,00">
       <input type="hidden" name="NAME-1100" value="0,00">
Run Code Online (Sandbox Code Playgroud)

namevaluehtml 标签属性总是不同的。

我需要将制表符分隔的值放入单独的文件中,其名称与原始文件相对应。

00B5JZ 350378,00
0599 0,00
0096 0,00
0433 0,00
1100 0,00
Run Code Online (Sandbox Code Playgroud)

应从value的值中删除点

编辑:我决定编辑这篇文章,并为阅读本文的人提供另一种方法:

假设文件是file1.txt​​ , file2.txt,file3.txt当前目录中没有其他内容:

for f in file*txt; do cat ${f} | sed 's/^[[:space:]]*//;s/<input.*name="NAME-//;s/" value="/\t/;s/">//;s/\.//g' > ${f//\.txt/_out\.txt}; done
Run Code Online (Sandbox Code Playgroud)
  1. 首先我们得到所有文件名
  2. cat将它们一一传递给sed
  3. 删除行开头的所有空格
  4. name删除的值以内的所有内容
  5. 用制表符替换name's 值和's 值之间的所有内容value
  6. 删除value's 值之后的所有内容
  7. 将结果保存到新文件,在文件扩展名_out之前添加后缀到原始文件名txt

cho*_*oba 5

使用sed:

sed -e 's/.*NAME-\([^"]*\)" value="\([^"]*\)".*/\1\t\2/' -e 's/\.//g' INPUT.HTML
Run Code Online (Sandbox Code Playgroud)
  • .*任何字符零次或多次
  • [^"]*任意字符但"重复 0 次或多次
  • \(...\)捕获封闭的部分,这里上面的子字符串直到双引号被记住\1,并且值被记住\2
  • s/PATTERN/REPLACEMENT/用替换项替换该模式;在这里,它提取 NAME- 和值之后的部分,并用制表符 ( \t)分隔的两个捕获的部分替换整行
  • s/\.//g删除所有点(/g意思是“全局”,即所有点)