AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 483681
Accepted
flish
flish
Asked: 2018-11-24 06:04:03 +0800 CST2018-11-24 06:04:03 +0800 CST 2018-11-24 06:04:03 +0800 CST

在文件中查找文本并复制到 csv

  • 772

我需要提取一堆html文件中的文本(大约500K)要复制的文本看起来像<div class='cls '>text to be copied including some<span>and <p></p></span>and more text</div>

我决心(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)

我已经阅读了有关如何使用 grep 执行此操作的其他问题,我认为该命令是

grep -r "/(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)/" *.html > output.txt

它不起作用。我究竟做错了什么?

也试过pcregrep -r -regexp="/(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)/" --file-list=fl.txt > output.txt- 它什么都不做pcregrep -r -regexp="/(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)/" > output.txt- 什么都没有

编辑1:尝试以下格式的建议:

grep -f -r "/(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/" *.html >> touch output.txt
grep: -r: No such file or directory
grep -f -r "/(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/" *.html >> output.txt
grep: -r: No such file or directory
grep -f -r "/(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/" *.html >> output.txt
grep: -r: No such file or directory

 grep -f "/(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/" file111.html >> touch output.txt
grep: /(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/: No such file or directory

和其他一些排列,仍然没有

grep pcregrep
  • 3 3 个回答
  • 1102 Views

3 个回答

  • Voted
  1. Best Answer
    RudiC
    2018-11-24T06:28:45+08:002018-11-24T06:28:45+08:00

    不知道为什么你添加了所有这些花里胡哨的东西。这个简单的正则表达式对我有用:

    grep "<div\sclass='cls\s'>.*<\/div>" file
    <div class='cls '>text to be copied including some<span>and <p></p></span>and more text</div>
    
    • 2
  2. Scott - Слава Україні
    2018-11-24T06:59:08+08:002018-11-24T06:59:08+08:00

    你有六个问题:

    1. 您包括/在正则表达式的开头和结尾。您输入、和其他程序进行搜索,但您不需要它来搜索。而且,实际上,只会在模式中包含文字字符。/regex/sedvigrepgrep/
    2. 要在 (plain) 中使用 PCRE grep,您必须使用-P.
    3. 没有这样的事情-regexp; 它必须是--regexp。或者—regexp=像在grep.

    一旦我修复了上述错误,两个命令 (grep -P和) 都可以正常工作——但它们打印了包含模式的整行,包括 . 之前或之后的pcregrep任何文本。<div …></div>

    1. 要仅打印与模式匹配的文本,您必须指定-o.

    即使在我修复了它之后,我也得到了<div …>输出(但不是 之前的文本<div …>,或者</div>之后的任何内容)。所以,

    1. 您的后视组有问题 - 它被包含在匹配中。

      不幸的是,我对 PCRE 知之甚少,无法确切知道问题是什么或如何解决它。幸运的是,我知道的足够pcregrep多,知道一个解决方法。如果您的正则表达式中有多个捕获组, pcregrep让您选择要写入输出的捕获组。所以,我们可以pcregrep 通过将look-behind变成一个捕获组,然后忽略它来让它起作用:

      pcregrep -o 2 -r "(\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)"

      但即使这样也比它需要的更复杂。第一个 ( <div …>) 组不需要是捕获组;即,它根本不必是一个组。同样,最后一个组(</div>前瞻组)根本不必是一个组。唯一需要成为一个组的是您要捕获的部分 -<div …>和之间的部分</div>:

      pcregrep -o1 -r "\<div\sclass\=\'cls\s\'\>(.*)\<\/div\>"

      请注意,我更改-o2为-o1是因为现在只有一组。 

      顺便说一句,正如RudiC 发现的(但没有提到),这些反斜杠几乎都不是必需的。AFAICT,您唯一需要的是\s字符串中的那些;所以我们可以将上面的内容简化为:

      pcregrep -o1 -r "<div\sclass='cls\s'>(.*)</div>"

      现在我们已经消除了正则表达式的所有 PCRE 部分(前瞻和后视),您可能认为我们可以将此正则表达式与 plain 一起使用grep。不幸的是,我们不能;上面的命令取决于没有的选项。-oNgrep

      但是,我们可以将它与sed!

      sed -n -r "s|.*<div\sclass='cls\s'>(.*)</div>.*|\1|p"

      与pcregrep命令一样,它会搜索整个正则表达式(包括 之前<div …>或之后的内容</div>,因为我.*在开头和结尾添加了内容)并将其替换为 #1 捕获组(唯一的一个)。最后p的 导致它打印匹配的行;该-n选项导致它不打印不匹配的行。

      以上|用作正则表达式分隔符,因为正则表达式包含/. 如果要/用作分隔符,则必须转义文本/(in </div>):

      sed -n -r "s / .*<div\sclass='cls\s'>(.*)< \/ div>.* / \1 / p"

      不幸的是,sed没有递归搜索功能。-r选项sed类似于; _ -E_ grep它指定了扩展正则表达式 (ERE) 的使用。没有它,我们将需要使用\(and\)捕获组:

      sed -n "s/.*<div\sclass='cls\s'> \( .* \) <\/div>.*/\1/p"

      当然,您可以通过运行来进行递归sed搜索find。

      PS 如果您在一行中有多个<div …>...对,这些命令将只打印第一个。</div>sed

    2. 您正在执行错误的递归(目录树)搜索。

      grep -r正则表达式*.html

      (pcregrep同样)查看每个.html文件,然后查看名称以 . 结尾的任何目录中及其下 的每个文件。因此,如果(不太可能?)您有一个名为 的子目录,那么上述命令将搜索该目录中的每个文件(即使它被称为or )。如果(我认为更有可能)您有名称类似于and的子目录,则不会搜索它们。 .htmlfoo.htmlMakefileREADME.txtpage42index

      你想做的是:

      grep -r --include='*.html'正则表达式。

      它对从.(当前目录)开始的所有目录进行递归搜索,只查看名称匹配的文件*.html。

    • 2
  3. KuboMD
    2018-11-24T06:21:04+08:002018-11-24T06:21:04+08:00
    grep -r "/(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)/" *.html > output.txt
    

    正在递归工作,但不解释正则表达式。尝试使用 fgrep 或 grep -f -r。此外,您可能想要touch output.txt使用>> 而不是>。

    • 1

相关问题

  • 来自 `service | 的意外结果 grep`

  • 读取带有单词的文本文件及其出现次数和排序的打印输出

  • 命令 ls | grep 只显示目录(当它也应该显示文件时)

  • grep 什么时候计数,什么时候不计数

  • grep --line-buffered 直到 X 行?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve