不想要贪婪的正则表达式行为。通常的治疗方法不起作用

时间:2015-08-25 13:34:49

标签: regex awk

我有一个大文档,我需要将锚点放入。我在行尾添加了一个数字。格式为“区域1”此列表继续进行数百个条目。

我试图用锚点掏出我想要的切片,但这就是我得到的。

cat file | awk '/Area 5/{print $0}'
Area 5
Area 50
Area 51
Area 52
Area 53
Area 54
Area 55
Area 56
Area 57
Area 58
Area 59

正如你所看到的,我只想要“区域5”,但正则表达式引擎与5和5x相匹配。是的,我知道它很贪婪。我尝试用以下方法限制该行为:

/Area 5{1}/

我仍然有这个问题。我也试过{0}和{0,1}没有效果。

问题1:如何强制awk(以及grep)将其限制为所需的数量?

问题2:我使用awk '/pattern/ { $0=$0 "" ++i }1'来附加数字。它留下“区域1”我希望它是Area1。有什么想法吗?

感谢您的帮助。 乙

4 个答案:

答案 0 :(得分:2)

为避免匹配' 5x'等前缀,您可以使用字边界。 (Explanation

在awk中,使用\y匹配单词边界。 为了消除区域之间的空间,我只需匹配组'区域'数字' 5'然后打印它们没有空间。

在我的测试中,以下工作:

 cat test.txt | awk '/Area 5\y/{print $1 $2}'

输出

Area5

答案 1 :(得分:2)

/Area 5([^0-9]|$)/将占据行尾,以及除数字之外的任何东西。

但更多awk做事的方式是:

awk '/^Area/ && $2==5' file

答案 2 :(得分:0)

如果'5'是该行的结尾,则可以使用stride。 $匹配行尾。

如果后面跟着进一步的文字,/Area 5$/应该有效。 /Area 5[^0-9]/匹配除了数字之外的任何字符。

祝你好运!

答案 3 :(得分:0)

一些建议 awk' $ 2 == 5'档案
区域5
awk' $ 2~ / ^ [5] $ /'文件
区域5