使用sed + regexp

时间:2019-06-30 23:49:13

标签: regex sed substring

我正在尝试使用sed和regexp获取子字符串。我想获取以“:”分隔的第一个和第二个“字段”。

要获取第一个字段,我使用了以下命令,但不知道如何获取第二个字段。

用于获取第一个字段的命令:

sed -r -n '1,2 s/([^:]+).*/\1/p' /etc/passwd

输入文件(示例):

root:x:0:0:root:/root:/bin/bash   
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

命令结果:

root   
daemon

但是我尝试获取第一个(“ root”)和第二个(“ x”)字段(仅基于文件第一行的示例),但是我没有成功。

我尝试过:

sed -r -n '1,2 s/([^:]+).*([^:]+).*/\1 \2/p' /etc/passwd

命令结果:

root h   
daemon n

所需结果:

root x   
daemon x

2 个答案:

答案 0 :(得分:1)

sed使用greedy match。在

sed -r -n '1,2 s/([^:]+).*([^:]+).*/\1 \2/p' /etc/passwd
                        ^^

.*匹配尽可能多的字符。您需要

sed -r -n '1,2 s/([^:]+):([^:]+).*/\1 \2/p' /etc/passwd
                        ^

演示http://ideone.com/wjL7Za

顺便说一句,更简单的方法是使用cut

cut -d ":" -f 1,2 --output-delimiter=' ' /etc/passwd

演示http://ideone.com/stJdSy

答案 1 :(得分:0)

另一个返回期望结果的表达式是:

([a-z]+):([a-z]+).*

RegEx Demo


sed -r -n '1,2 s/([^:]+):([^:]+).*/\1 \2/p'

Sed Demo