【问题标题】:cat or grep a html file to find specific text [duplicate]cat 或 grep html 文件以查找特定文本 [重复]
【发布时间】:2018-09-03 06:41:02
【问题描述】:

我正在尝试使用 bash 来解析和使用 grep 的 HTML 文件。

HTML 不会改变,所以我应该能够很容易地找到文本。

HTML 将是这样的,我只想要每次文件更改时都会更改的数字:

<div class="total">
          900 files inspected,
          28301 offenses detected:
        </div>


grep -E '^<div class="total">.</div>' my_file.html

理想情况下,我只想提取违规次数,因此在上面的示例中为 28301。我也想将其分配给一个变量。

我接近了吗?

【问题讨论】:

  • 一种更可靠的方法类似于tidy -asxml &lt;my_file.html | xmlstarlet sel -N 'h=http://www.w3.org/1999/xhtml' -t -m '//h:div[@class="total"]' -v './text()' -n——尽管与此关闭的重复项与您的要求相符,而不是最佳/稳健实践。
  • 您也可以在完全不使用正则表达式或任何外部工具的情况下完成整个工作。 x="$(&lt;file.html)"; x="${x%% offenses detected*}"; x="${x##*[^0-9]}"
  • ghoti 你能分解一下你的例子中发生了什么吗?
  • 上面使用的语法在wiki.bash-hackers.org/syntax/pe有详细描述,covered in BashFAQ #100也有。
  • 感谢您的链接

标签: bash


【解决方案1】:

你可以做一个简单的

a=$(grep -oP '(\d+)(?=\soffenses\sdetected)' abc);echo $a

将给予:

28301

-o 只给出该行的匹配部分

-P 在regex中使用perl正则表达式

abc 是文件名

(\d+)(?=\soffenses\sdetected) 在这个reges中,我们只是使用正向前瞻来捕获特定单词后跟的所需数字

【讨论】:

  • 谢谢,有道理我感谢您的解释
  • 请注意,这取决于 GNU grep,特别是使用可选库 libpcre 编译的 GNU grep
  • 为了构建来自 Charles 的 GNU grep 注释,我将指出任何类型的 grep 实际上都不是 bash 的一部分,并且因系统而异. BSD 系统可能安装了一个可选的pcregrep 二进制文件和一个pcre 包,其行为类似于grep -P,macOS 可以使用Macports 或Brew 获得相同的工具。
  • @CharlesDuffy 绝对有效点
【解决方案2】:

如果你有 GNU grep 和 GNU sed,你可以这样做:

$ cat file | xargs | grep -Po '<div class=total>\K(.*?)</div>' | sed -E 's/<\/div>//; s/, /\n/'
 900 files inspected
28301 offenses detected: 

如果您有ruby 可用:

$ ruby -e 'puts readlines.join[/(?<=<div class="total">).+(?=<\/div>)/m].gsub(/^[ \t]+/m,"")' file 
900 files inspected,
28301 offenses detected:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    相关资源
    最近更新 更多