使用grep/sed提取字符串的一部分

8

我在Linux中有一个文件,其中包含类似以下条目的信息:

dn: CN=HP_NetworkSupport,OU=groups,DC=HDFCSLDM,DC=COM
dn: CN=Review users,OU=groups,DC=HDFCSLDM,DC=COM

我希望只提取中文信息,直到第一个逗号,例如:

> HP_NetworkSupport
> Review users

在上述情况下,将内容复制到另一个文件中的命令是什么?
5个回答

19

这是一种利用前瞻的方法:


grep -Po '(?<=CN=)[^,]*' file > new_file

它获取从 CN=(不包括)到逗号 , 之间的所有文本。 [^,]* 的思想是获取任何不是逗号的字符。

测试

$ grep -Po '(?<=CN=)[^,]*' file
HP_NetworkSupport
Review users

1
这是软件工程工作的一部分 - 预测客户会使用什么。而且他们很可能会使用。 - mvp
1
尽管对于许多正则表达式问题来说,正确的答案并不是正则表达式,而是合适的解析器。 - mvp
1
我的意思是,这是一个很好的例子,回答这个问题必须使用LDAP解析器才能100%正确。从技术上讲,LDAP CN或OU 可能在其内部包含文本“CN = blah”(可能带引号)。怎么样?这类似于您无法使用正则表达式解析XML的前提。 - mvp
1
感谢您提供http://www.regular-expressions.info/lookaround.html链接。 - user801154
1
@DavidKennedy 试试看吧;-) 我试过了,我的GNU grep说这不是必要的:grep -Po '(?<=<hola>).*(?=</hola>)' <<< "<hola>adeu</hola>" 毫无问题地返回“adeu”。当然,你可以转义每个字符,但这个不是必要的。 - fedorqui
显示剩余8条评论

5

使用 awk

awk -F"=|," '{print $2}' file
HP_NetworkSupport
Review users

或者
awk -F[=,] '{print $2}' file
HP_NetworkSupport
Review users

将分隔符设置为,=,然后打印第二个字段。
要处理逗号内的字段,您应该使用LDAP解析器,但这应该可以工作。
echo file
dn: CN=HP_NetworkSupport,OU=groups,DC=HDFCSLDM,DC=COM
dn: CN="Review, users",OU=groups,DC=HDFCSLDM,DC=COM

awk -F"CN=|,OU" '{print $2}' file
HP_NetworkSupport
Review, users

2

使用 sed 命令:

$ sed -r 's/.*CN=([^,]*),.*/\1/' inputfile
HP_NetworkSupport
Review users

2
perl -lne 'print $1 if(/CN=([^\,]*),/)' your_file

以下已测试:

> cat temp
dn: CN=HP_NetworkSupport,OU=groups,DC=HDFCSLDM,DC=COM
dn: CN=Review users,OU=groups,DC=HDFCSLDM,DC=COM
> perl -lne 'print $1 if(/CN=([^\,]*),/)' temp
HP_NetworkSupport
Review users
>

-2

通过这个命令进行管道传输:

sed -E "s/.*CN=(.+?),OU=.*/\\1/g"

1
这对您有用吗?我认为'sed'无法使用非贪婪量词,而且必须转义括号才能进行分组。 - Birei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接