使用sed拉出字符串的最后部分

时间:2016-02-10 05:22:43

标签: regex string windows awk sed

我确信必须有一个简单的答案,但我无法解决这个问题,我在这里发现的类似问题并不能让我跨越这条线路(尽管他们帮助过了)。

我在Windows中有一个TestFile.txt文本文件,每行有不同数量的OU,如下所示:

"CN=John Doe,OU=Milk,OU=Dairy,OU=Food,DC=company,DC=com"
"CN=Jane Doe,OU=Red,OU=Apples,OU=Fruit,OU=Food,DC=company,DC=com"
"CN=Pete Doe,OU=Forks,OU=Cutlery,OU=NotFood,DC=company,DC=com"
"CN=Fred Doe,OU=Spoons,OU=Cutlery,OU=NotFood,DC=company,DC=com"
"CN=Alex Doe,OU=Biscuits,OU=Chocolate,OU=Candy,OU=Food,DC=company,DC=com"
"CN=Peta Doe,OU=Buttons,OU=Chocolate,OU=Candy,OU=Food,DC=company,DC=com"

我想删除无关数据,以便我只留下最后两个这样的OU:

OU=Dairy,OU=Food
OU=Fruit,OU=Food
OU=Cutlery,OU=NotFood
OU=Cutlery,OU=NotFood
OU=Candy,OU=Food
OU=Candy,OU=Food

我已经使用sed的Windows端口轻松地删除了每行的开头和结尾:

sed -e "s/[^,]*,//" -e "s/,DC\=.*//" TestFile.txt

......这给了我:

OU=Milk,OU=Dairy,OU=Food
OU=Red,OU=Apples,OU=Fruit,OU=Food
OU=Forks,OU=Cutlery,OU=NotFood
OU=Spoons,OU=Cutlery,OU=NotFood
OU=Biscuits,OU=Chocolate,OU=Candy,OU=Food
OU=Buttons,OU=Chocolate,OU=Candy,OU=Food

所以现在我只需要在每一行上隔离最后两个OU并忽略其他所有内容。如果每行都有固定数量的OU,这会简化很多事情,但是如何制作一个sed表达式以容纳不同数量的OU?

3 个答案:

答案 0 :(得分:2)

使用GNU sed:

sed -r 's/.*(OU=[^,]*,OU=[^,]*),DC=.*/\1/' file

输出:

OU=Dairy,OU=Food
OU=Fruit,OU=Food
OU=Cutlery,OU=NotFood
OU=Cutlery,OU=NotFood
OU=Candy,OU=Food
OU=Candy,OU=Food

答案 1 :(得分:1)

好的,多亏了josifoski,我知道了:

cat TestFile.txt | sed -e "s/[^,]*,//" -e "s/,DC\=.*//" | gawk -F, "{ print $(NF-1), $NF; }"

完美,谢谢。 =)

答案 2 :(得分:0)

假设在每行的最终OU之后总是只有两个字段。这可能是AWK中的解决方案。只是AWK。

awk -F, '{OU=$(NF-3)","$(NF-2); print OU}' file > outfile

哪个输出:

OU=Dairy,OU=Food
OU=Fruit,OU=Food
OU=Cutlery,OU=NotFood
OU=Cutlery,OU=NotFood
OU=Candy,OU=Food
OU=Candy,OU=Food