grep包含在同一行中的2个正则表达式之间

时间:2014-09-21 11:49:49

标签: regex unix sed grep

我有一个这样的文件:

1. Dé 33 2. iis ET 3. 56 RRE- 4. etc...

我想得到:

1. Dé 33
2. iis ET
3. 56 RRE-
4. etc...

我想用grep或sed。我尝试了许多不成功的命令。我找到的最接近的命令是:

cat myfile | grep -o '[0-9]\{1,2\}\. '

导致:

1.
2.
3.
4.

所以,基本上我需要的是一个grep函数,它可以选择两个正则表达式之间的东西(例如,我希望所有东西都在一个数字之间徘徊)

有什么想法吗? 非常感谢!

3 个答案:

答案 0 :(得分:3)

使用sed

$ echo " 1. Dé 33 2. iis ET 3. 56 RRE- 4. etc..." | sed 's/[0-9]\+\./\n&/g'

1. Dé 33 
2. iis ET 
3. 56 RRE- 
4. etc...

<强>解释

搜索模式
[0-9] \ +搜索数字,列表中必须存在一位数字,例如[0-9] *可以找到数字但也可以是空字符串。
\。在这种情况下,dot必须被反击。在正则表达式代表anychar

替换模式中的


\ n将添加换行符,
&安培;将使用相同的搜索模式,换句话说,除了在条件之前插入\ n时,没有任何变化 g最后将替换所有找到的搜索模式

短期内的想法是将newline \ n char放在以点

结尾的数字之前

答案 1 :(得分:2)

您可以使用此awk

awk '{for (i=1;i<=NF;i++) printf "%s%s",$i,(i%3==0?RS:FS)}' file
1. De 33
2. iis ET
3. 56 RRE-
4. etc.. 

答案 2 :(得分:0)

如果你的grep支持-P,那么你可以使用下面的grep命令。

$ grep -oP '.*?(?=\s\d+\.|$)' file
1. Dé 33
2. iis ET
3. 56 RRE-
4. etc...

.*?(?=\s\d+\.|$)必须遵循零个或多个字符的非贪婪匹配[再按一个空格后跟一个或多个数字,再后跟一个点] 结束时行锚$