重复正则表达式模式

时间:2010-10-20 16:32:46

标签: regex sed

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

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

的输入
250.    7.9    Shutter Island (2010)    110,675

将返回:

Shutter Island (2010)

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

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

我已尝试([^-\t]*\t){2,2}(和变体),但我猜这是在尝试匹配[^-\t]*\t\t?

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

6 个答案:

答案 0 :(得分:6)

这对我有用:

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

如果您的sed支持-r,您可以摆脱大部分转义:

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

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

这也有效:

sed 's/[^\t]\+/\n&/3;s/.*\n//;s/\t.*//' films.txt

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

答案 1 :(得分:4)

我想你可能会以错误的方式解决这个问题。如果你只想提取电影的名字,并且它是发行年份,那么你可以试试这个正则表达式:

(?:\t)[\w ()]+(?:\t)

如此处所见:

http://regexr.com?2sd3a

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

答案 2 :(得分:4)

要使用重复的花括号并使用sed正确分组括号,您可能需要使用反斜杠转义它,例如

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

是的,此命令将适用于您的示例。

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

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

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

答案 3 :(得分:2)

您可以将它们放在括号中重复,如下所示:

([^-\t]*\t){2,2}

与标题匹配的完整模式是:

([^-\t]*\t){2,2}([^-\t]+).*

你说你试过了。我不确定有什么不同,但上面的示例数据对我有用。

答案 4 :(得分:2)

你为什么要这么做事?

$ awk '{$1=$2=$NF=""}1' file
  Shutter Island (2010)

答案 5 :(得分:1)

如果这是带有常规格式的制表符分隔文件,我会使用cut代替sed

cut -d' ' -f3 films.txt

请注意-d之后的引号之间只有一个标签,可以在shell提示符下键入ctrl + v,即ctrl+v ctrl+i