我在文件Output.dat中具有以下内容。我需要提取价值之间dn: uid=
和,ou=
dn: uid=user1,ou=Active,ou=Member,dc=domain,dc=org
dn: [email protected],ou=Active,ou=Member,dc=domain,dc=org
dn: uid=usertest,ou=Active,ou=Member,dc=domain,dc=org
dn: uid=abc1,ou=Active,ou=Member,dc=domain,dc=org
sed -e '/dn: uid=/,/,ou=/p' output.dat but
它返回整行而不是值。sed -e '/dn: uid=/,/,ou=/\1/p' output.dat
然后出现以下错误: sed: -e expression #1, char 18: unknown command: `\'
如果您具有-P
支持PCRE()的GNU grep版本,则假设您的意思是第一次出现,ou
grep -oP '(?<=dn: uid=).+?(?=,ou=)' file
如果要匹配第二个 ,ou
,可以删除非贪婪?
修饰符
grep -oP '(?<=dn: uid=).+(?=,ou=)' file
括号中的表达式是零长度的断言(又称环顾四周),表示它们构成匹配的一部分,但不作为结果的一部分返回。您可以在perl中本地执行相同的操作,例如
perl -ne 'print "$1\n" if /(?<=dn: uid=)(.+?)(?=,ou=)/' file
可以使用常规(非零长度)分组在sed中执行类似操作,例如(对于GNU sed-其他变体可能需要额外的转义)
sed -rn 's/(.*dn: uid=)([^,]+)(,ou=.*)/\2/p' file
或略微简化
sed -rn 's/.*dn: uid=([^,]+),ou=.*/\1/p' file
请注意,[^,]
这里的hack有点问题,因为sed没有真正的非贪婪匹配选项。
事后思考:尽管这并不是您所要的,但实际上您想要name=value
从文件中读取逗号分隔的对,然后从名称中进一步拆分第一个字段的值,这似乎是您真正想要做的。您可以通过多种方式实现这一目标-包括
awk -F, '{sub(".*=","",$1); print $1}' file
或纯现金解决方案,例如
while IFS=, read -r a b c d; do printf '%s\n' "${a#*=}"; done < file
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句