首先,我不知道这是否真的可能,但我想做的是重复一个正则表达式模式。
我使用的模式是:
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?
此外,如果有任何方法可以使我上面的代码更短更干净,我们将不胜感激。
最佳答案
这对我有用:
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)。
关于regex - 重复正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3980171/