Grep中有真正的通用通配符吗?

时间:2009-12-13 19:04:06

标签: regex bbedit

这里真的很基本的问题。所以我被告知是一个点。匹配任何字符,除了换行符。我正在寻找与任何角色相匹配的东西,包括换行符。

我想要做的就是捕获两个特定字符串之间的网站页面中的所有文本,剥离页眉和页脚。像HEADER TEXT(。+)FOOTER TEXT之类的东西然后提取括号中的内容,但我找不到在页眉和页脚之间包含所有文本和换行符的方法,这有意义吗?提前谢谢!

7 个答案:

答案 0 :(得分:7)

当我需要匹配多个字符(包括换行符)时,我会这样做:

[\s\S]*?

注意我使用的是非贪婪的模式

答案 1 :(得分:3)

你可以用Perl做到这一点:

$ perl -ne 'print if /HEADER TEXT/ .. /FOOTER TEXT/' file.html

要仅在分隔符之间打印文本,请使用

$ perl -000 -lne 'print $1 while /HEADER TEXT(.+?)FOOTER TEXT/sg' file.html

/s开关使正则表达式匹配器将整个字符串视为 s 单行,这意味着点匹配换行符,而/g表示匹配的次数与可能的。

上面的示例假设您正在启动本地磁盘上的HTML文件。如果您需要先获取它们,请使用LWP::Simple中的get

$ perl -MLWP::Simple -le '$_ = get "http://stackoverflow.com";
                          print $1 while m!<head>(.+?)</head>!sg'

请注意,使用上面的正则​​表达式解析HTML在一般情况下不起作用!如果您正在使用快速而脏的扫描仪,那很好,但对于需要的应用程序为了更健壮,使用真正的解析器。

答案 2 :(得分:3)

根据定义,grep查找匹配的行;它读取一行,看它是否匹配,并打印该行。

实现目标的一种可能方式是sed

sed -n '/HEADER TEXT/,/FOOTER TEXT/p' "$@"

这将从匹配'HEADER TEXT'的第一行打印到匹配'FOOTER TEXT'的第一行,然后迭代; '-n'停止默认的'打印每一行'操作。如果页眉和页脚文本出现在同一行上,这将无法正常工作。

要做你想做的事,我可能会使用perl(但如果你愿意,可以使用Python)。我考虑啜饮整个文件,然后使用适当的合格的正则表达式来查找文件的匹配部分。然而,由'@gbacon'给出的Perl单行是对上面'sed'脚本的Perl的几乎完全音译,并且比啜饮更整洁。

答案 3 :(得分:2)

grep的手册页说:

  

grep,egrep,fgrep,rgrep - 打印匹配模式的行

grep不适用于匹配多行。您应该尝试使用perlawk来解决此任务。

答案 4 :(得分:2)

由于这是用'bbedit'标记的,并且BBedit支持Perl样式模式修饰符,你可以让点与开关匹配换行符(?s)

(αS)。

将匹配任何角色。是的, (?s)+ 将匹配整个文本。

答案 5 :(得分:1)

正如其他地方所指出的那样,grep将适用于单行内容。

对于多行(在红宝石中使用Regexp :: MULTILINE,或者在python,awk,sed等等),“\ s”也应该捕获换行符,所以

HEADER TEXT(.*\s*)FOOTER TEXT 

可能有用......

答案 6 :(得分:0)

这是用gawk做的一种方法,如果有的话

awk -vRS="FOOTER" '/HEADER/{gsub(/.*HEADER/,"");print}' file