【问题标题】:Using sed to pull out the last parts of a string使用 sed 拉出字符串的最后部分
【发布时间】:2016-05-20 08:19:22
【问题描述】:

我确信必须有一个简单的答案,但我无法解决这个问题,而且我在这里找到的类似问题并没有让我完全理解(尽管他们有所帮助)。

我在 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

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

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?

【问题讨论】:

  • 将 awk 添加到标签中,并在可能的情况下刷新问题。用 awk 很简单
  • 啊,你的意思是:gawk -F, "{ print $(NF-1), $NF; }" TestFile.txt ??
  • 快速学习者看起来不错

标签: regex string windows awk sed


【解决方案1】:

使用 GNU sed:

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

输出:

OU=乳制品,OU=食品 OU=水果,OU=食物 OU=餐具,OU=NotFood OU=餐具,OU=NotFood OU=糖果,OU=食物 OU=糖果,OU=食物

【讨论】:

  • 我喜欢这样 - 更简洁,也只有一个命令。谢谢!
【解决方案2】:

好的,感谢 josifoski,我知道了:

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

完美,谢谢。 =)

【讨论】:

  • (a) 在绝对不需要的情况下使用cat,您将获得 UUoC(cat 的无用使用)奖。 (b) 你不应该真的需要同时使用sedawk;两者都可以自己完成工作。
  • 还在学习这些东西。 =) Cyrus 最后发布了最好的解决方案。阅读表达式后现在更有意义了。
【解决方案3】:

假设每行的最终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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多