首页 > 解决方案 > 如何在 bash 中使用 sed/awk 将字符串从模式剪切到模式

问题描述

我不知道如何使用 sed 或 awk 来修剪文件中的字符串。我已经搜索了好几个小时没有想要的结果。我有一个这样的字符串:

c=one, o=roll, root ca          valid until: date
c=one, o=roll, root ca          Located: location
c=two roll, root ca             valid until: date
c=two roll, root ca             Located: location

我想要的输出在列中对齐:

c=one            valid until: date
c=one            Located: location
c=two roll       valid until: date
c=two roll       Located: location

我正在使用 sed 命令,它不像(以及许多其他)那样工作:

sed 's/,.*\^([valid])//g' file.txt

但我无法弄清楚第二个条件,直到“有效”这个词,以及同一命令中的“有效”和“位置”。非常感谢!

标签: awksed

解决方案


$ sed -E 's/,.*(valid|Located)/ \1/' ip.txt
c=one valid until: date
c=one Located: location

您可以将 terms valid, Located(以及您想要的任何其他此类术语)放在一个捕获组中。然后\1在替换部分使用反向引用将其放回原处。

要对齐输出,您可以使用|输入中未出现的某些字符,然后使用column命令

$ sed -E 's/,.*(valid|Located)/|\1/' ip.txt | column -t -s'|'
c=one       valid until: date
c=one       Located: location
c=two roll  valid until: date
c=two roll  Located: location

推荐阅读