重复正则表达式模式

akd*_*446 4 regex sed

首先,我不知道这是否真的可行,但我想要做的是重复正则表达式模式.我正在使用的模式是:

sed 's/[^-\t]*\t[^-\t]*\t\([^-\t]*\).*/\1/' films.txt
Run Code Online (Sandbox Code Playgroud)

输入

250.    7.9    Shutter Island (2010)    110,675
Run Code Online (Sandbox Code Playgroud)

将返回:

Shutter Island (2010)
Run Code Online (Sandbox Code Playgroud)

我匹配所有无选项卡,(250.)然后选项卡,然后所有无选项卡(7.9)然后选项卡.接下来,我将电影片名重新标记,然后匹配所有剩余的字符(110,675).

它工作正常,但即时学习正则表达式,这看起来很难看,正则表达式[^ - \t]*\t在其自身之后重复,无论如何重复这个就像你可以像{2,2}这样的角色?

我试过([^-\t]*\t){2,2}(和变化),但我猜这是试图匹配[^-\t]*\t\t?

此外,如果有任何方法可以使我的上述代码更短更清洁任何帮助将不胜感激.

Pau*_*ce. 6

这对我有用:

sed 's/\([^\t]*\t\)\{2\}\([^\t]*\).*/\2/' films.txt
Run Code Online (Sandbox Code Playgroud)

如果你的sed支持-r你可以摆脱大部分逃脱:

sed -r 's/([^\t]*\t){2}([^\t]*).*/\2/' films.txt
Run Code Online (Sandbox Code Playgroud)

更改第一个2以选择不同的字段(0-3).

这也有效:

sed 's/[^\t]\+/\n&/3;s/.*\n//;s/\t.*//' films.txt
Run Code Online (Sandbox Code Playgroud)

更改3以选择不同的字段(1-4).


Ch.*_*dea 5

要正确使用重复的大括号和分组括号sed,您可能必须使用反斜杠将其转义,例如

sed 's/\([^-\t]*\t\)\{3\}.*/\1/' films.txt

是的,此命令将在您的示例中正常工作。

如果您对此感到恼火,可以选择放置 -r 选项以启用正则表达式扩展模式并忘记括号上的反斜杠转义。

sed -r 's/([^-\t]*\t){3}.*/\1/' films.txt

发现这与丹尼斯威廉姆森的答案几乎相同,但我要离开它,因为它是更短的表达方式。


小智 4

我认为你可能以错误的方式处理这个问题。如果您只是想提取电影的名称及其发行年份,那么您可以尝试以下正则表达式:

(?:\t)[\w ()]+(?:\t)
Run Code Online (Sandbox Code Playgroud)

正如此处所见:

http://regexr.com?2sd3a

请注意,它匹配实际所需字符串开头和结尾的制表符,但不将它们包含在匹配组中。