sed正则表达式在比赛后切断字符串

时间:2017-05-09 06:43:16

标签: regex bash sed

我在http://regexr.com/上测试了一个正则表达式,它的效果与预期相符。

如何使用sed

运行此功能
/^.*?OU=([^,]*)/g

测试字符串如下所示:

mario.test;Mario Test;Mario;Test;123;+001122334455;CN=Mario Test,OU=AT-Test,OU=Tese Sites,DC=Test,DC=local;test.local

输出是:

mario.test;Mario Test;Mario;Test;123;+001122334455;CN=Mario Test,OU=AT-Test

所以它应该在第二个OU=开始之前剪切字符串。

由于

2 个答案:

答案 0 :(得分:2)

当您必须处理包含“列”的文本并且可以拆分时,

sed不是此案例的最佳工具。这有两种可能性,一种是sed,另一种是awk

s="mario.test;Mario Test;Mario;Test;123;+001122334455,CN=Mario Test,OU=AT-Linz,OU=Tese Sites,DC=Test,DC=local;test.local"
echo $s | sed 's/OU=/й/' | sed 's/\([^й]*\)й\([^,]*\).*/\1OU=\2/'
echo $s | awk -F",OU=" '{print $1 ",OU=" $2}'

请参阅online demo

awk解决方案使用,OU=子字符串进行拆分,然后使用分隔符连接第一列和第二列(因为它是硬编码的,很容易将其放回)。

sed使用2次传递:1)添加一个未使用的char(必须是一个控制字符,这里,西里尔字母用于更好的“可见性”)来标记我们的匹配边界,2)匹配所有我们不需要和匹配的东西捕获我们需要在捕获组和反向引用的帮助下保留。

答案 1 :(得分:2)

你的问题不明确,但是从阅读你的评论来看,这些都是你正在寻找的吗?

$ awk -F, '{print $1 FS $2}' file
mario.test;Mario Test;Mario;Test;123;+001122334455;CN=Mario Test,OU=AT-Test

$ awk -F'CN=[^,]+,OU=|,' '{print $1 $2}' file
mario.test;Mario Test;Mario;Test;123;+001122334455;AT-Test