Grep 带空格的文本

Grep 带空格的文本

我四处搜索并找到了这两个主题,但是它们是不同的,因为空间数量是固定的,而我的样本没有固定的空间数量。

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),但例如,如果您知道spana 内div//div/span.还有更多可供选择的选项

答案3

听起来您想要匹配除 和 之外的字符序列<>因此 <number>:

grep -Po '[^<>]* \d+:[^<>]*'

答案4

Perl Look(ahead|behind) 可能会有所帮助:

grep -Po "(?<=>).+(?=</)" yourfile

这匹配 html 标签之间的任何内容并删除这些标签

相关内容