这里真的很基本的问题。所以我被告知一个点。匹配除换行符以外的任何字符。我正在寻找与任何字符匹配的东西,包括换行符。
我要做的就是在两个特定字符串之间捕获网站页面中的所有文本,剥离页眉和页脚。像 HEADER TEXT(.+)FOOTER TEXT 之类的东西,然后提取括号中的内容,但我找不到在页眉和页脚之间包含所有文本和换行符的方法,这有意义吗?提前致谢!
当我需要匹配多个字符(包括换行符)时,我会:
[\s\S]*?
注意我使用的是非贪婪模式
你可以用 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 文件。如果您需要先获取它们,请使用get
from LWP::Simple
:
$ perl -MLWP::Simple -le '$_ = get "http://stackoverflow.com";
print $1 while m!<head>(.+?)</head>!sg'
请注意,在一般情况下,使用上述正则表达式解析 HTML 是行不通的!如果您正在使用快速而肮脏的扫描仪,那很好,但是对于需要更健壮的应用程序,请使用真正的解析器。
根据定义,grep
查找匹配的行;它读取一行,查看它是否匹配,然后打印该行。
做你想做的一种可能的方法是sed
:
sed -n '/HEADER TEXT/,/FOOTER TEXT/p' "$@"
这将从匹配'HEADER TEXT'的第一行打印到匹配'FOOTER TEXT'的第一行,然后迭代;“-n”停止默认的“打印每一行”操作。如果页眉和页脚文本出现在同一行,这将无法正常工作。
为了做你想做的事,我可能会使用perl
(但如果你愿意,你可以使用 Python)。我会考虑 slurping 整个文件,然后使用适当限定的正则表达式来查找文件的匹配部分。然而,'@gbacon' 给出的 Perl 单行语句几乎是对上述 'sed' 脚本的 Perl 音译,并且比 slurping 更简洁。
由于它被标记为“bbedit”并且 BBedit 支持 Perl 样式的模式修饰符,因此您可以允许点将换行符与开关 (?s) 匹配
(?s)。
将匹配任何字符。是的, (?s).+ 将匹配整个文本。
的手册页grep
说:
grep, egrep, fgrep, rgrep - 打印匹配模式的行
grep
不是为匹配多于一行而设计的。您应该尝试使用perl
或来解决此任务awk
。
正如在别处指出的那样, grep 将适用于单行内容。
对于多行(在带有 Regexp::MULTILINE 的 ruby 中,或者在 python、awk、sed 等中),“\s”也应该捕获换行符,所以
HEADER TEXT(.*\s*)FOOTER TEXT
可能工作...
如果你有的话,这是用 gawk 做的一种方法
awk -vRS="FOOTER" '/HEADER/{gsub(/.*HEADER/,"");print}' file