我在一个文件夹中有一组 .html 文件,我正在尝试查看每个文件夹并提取特定的信息并将其存储到 CSV 文件中。
每个文件都包含类似的数据行:
<h1><span class='noScreen'>Intranet:<br/></span>CLAS1206: Web Infrastructure (2019-2020)</h1><div class='pageContentBars0'><hr class='hide'/>
我尝试将 CLAS 加上以下 4 个数字(每个文件不同)并采用类名“Web Infrastructure”(每个文件同样不同)来实现以下目的:
CLAS1206, Web Infrastructure(\n)
CLAS1000, Mathematics(\n)
CLAS2000, Science(\n)
ETC...
到目前为止,我已经设法使用 sed 命令删除了 CLAS 之前的所有内容,但我不知道接下来该怎么做。到目前为止,我的脚本中有以下内容:
#!/bin/bash
grep "<span class='noScreen'>" ./modules/CLAS1206.html | sed 's/^.*\(CLAS\)/\1/' | sed
终端上输出如下内容
CLAS1206: Web Infrastructure (2019-2020)</h1><div class='pageContentBars0'><hr class='hide'/>
如能提供关于如何进一步分解此行并将其转换为正确格式的任何帮助,我们将不胜感激!
答案1
以下是我要解决的问题:
sed '/noScreen/ !d ; s/.*\(CLAS[0-9]\{4\}:\).*\(class=.*\).*/\1\2/ ; s/class=.//; s/.\/.*//'
答案2
给你,伙计:
filenames="1.html 2.html 3.html"; for filename in $filenames; do grep 'pageContentBars0' $filename | sed 's/.*\(CLAS[^<\(]\+\).*/\1/' | sed 's/\:/,/'>>final.csv ; done
我假设它们都遵循相同的格式,因此最初使用类 pageContentBars0 进行过滤:
grep 'pageContentBars0' $filename
在这里,我正在寻找以 CLAS 开头的任何内容,捕获任何内容直到(
或<
。
.*\(CLAS[^<\(]\+\)
忽略其余部分,只需用捕获的内容替换整行即可重要信息:
.*/\1
最后,替换:
为,
:
sed 's/\:/,/'
答案3
您可以使用 xmllint 进行解析xpath来自 html 文件的节点。
$ xmllint --html --xpath '//h1/text()' file.html \
| sed -r 's/(.*): (.*) \(.*\)/\1, \2/' > file.csv