这里真的很基本的问题。所以我被告知是一个点。匹配任何字符,除了换行符。我正在寻找与任何角色相匹配的东西,包括换行符。
我想要做的就是捕获两个特定字符串之间的网站页面中的所有文本,剥离页眉和页脚。像HEADER TEXT(。+)FOOTER TEXT之类的东西然后提取括号中的内容,但我找不到在页眉和页脚之间包含所有文本和换行符的方法,这有意义吗?提前谢谢!
答案 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
不适用于匹配多行。您应该尝试使用perl
或awk
来解决此任务。
答案 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