我四处搜索并找到了这两个主题,但是它们是不同的,因为空间数量是固定的,而我的样本没有固定的空间数量。
https://stackoverflow.com/questions/47428445/i-want-grep-to-grep-one-word-which-is-having-spaces-it
https://askubuntu.com/questions/949326/how-to-include-a-space-character-with-grep
示例文本:
<span>Section 1: Plan your day, write out your plan</span>
期望的输出:
Section 1: Plan your day, write out your plan
我只想 grep 文本,而不是 HTML 标签。这是我的尝试。
wolf@linux:~$ cat file.txt
<span>Section 1: Plan your day, write out your plan</span>
wolf@linux:~$
wolf@linux:~$ grep -oP 'S\S+ \d: \S+' file.txt
Section 1: Plan
wolf@linux:~$
wolf@linux:~$ grep -oP 'S\S+ \d: \S+ \S+' file.txt
Section 1: Plan your
wolf@linux:~$
\S+
由于文本长度不同,除了一一定义之外,还有更好的解决方案吗?
答案1
使用扩展的正则表达式,锚定Section
关键字并获取其后不是 的所有内容<
:
$ grep -E -o 'Section [0-9]+:[^<]*' < file.txt
Section 1: Plan your day, write out your plan
我发现用 Perl 来锚定周围的部分是最简单的,所以如果这是一个选项:
$ perl -lne 'print $1 if m,<span>(Section \d+:.*?)</span>,' < file.txt
Section 1: Plan your day, write out your plan
(有一些方法可以用 做类似的事情grep -P
,但我发现它们有点难以阅读。)
答案2
如果您的 HTML 是有效的 XML,您可以使用xmlstarlet
它来挑选适当的元素值。
xmlstarlet sel -t -v '//span' -n file.html
Section 1: Plan your day, write out your plan
如果没有更多的页面结构,我无法提供更好的 XPath ( //span
),但例如,如果您知道span
a 内div
有//div/span
.还有更多可供选择的选项
答案3
听起来您想要匹配除 和 之外的字符序列<
,>
因此 <number>:
:
grep -Po '[^<>]* \d+:[^<>]*'
答案4
Perl Look(ahead|behind) 可能会有所帮助:
grep -Po "(?<=>).+(?=</)" yourfile
这匹配 html 标签之间的任何内容并删除这些标签