6

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

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

4

7 回答 7

7

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

[\s\S]*?

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

于 2009-12-13T19:16:20.847 回答
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开关使正则表达式匹配器将整个字符串视为单行,这意味着点匹配换行符,并且意味着/g尽可能多地匹配。

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

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

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

于 2009-12-13T19:09:32.617 回答
3

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

做你想做的一种可能的方法是sed

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

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

为了做你想做的事,我可能会使用perl(但如果你愿意,你可以使用 Python)。我会考虑 slurping 整个文件,然后使用适当限定的正则表达式来查找文件的匹配部分。然而,'@gbacon' 给出的 Perl 单行语句几乎是对上述 'sed' 脚本的 Perl 音译,并且比 slurping 更简洁。

于 2009-12-13T19:12:18.413 回答
2

由于它被标记为“bbedit”并且 BBedit 支持 Perl 样式的模式修饰符,因此您可以允许点将换行符与开关 (?s) 匹配

(?s)。

将匹配任何字符。是的, (?s).+ 将匹配整个文本。

于 2011-08-09T12:05:28.293 回答
2

的手册页grep说:

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

grep不是为匹配多于一行而设计的。您应该尝试使用perl或来解决此任务awk

于 2009-12-13T19:11:55.403 回答
1

正如在别处指出的那样, grep 将适用于单行内容。

对于多行(在带有 Regexp::MULTILINE 的 ruby​​ 中,或者在 python、awk、sed 等中),“\s”也应该捕获换行符,所以

HEADER TEXT(.*\s*)FOOTER TEXT 

可能工作...

于 2009-12-13T19:09:53.700 回答
0

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

awk -vRS="FOOTER" '/HEADER/{gsub(/.*HEADER/,"");print}' file
于 2009-12-14T00:02:32.520 回答