如何在bash中使用sedawk从图案中切割字符串直到图案

问题描述 投票:0回答:2

我不明白,如何使用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

但我不能找出第二个条件,直到单词 "有效",此外 "有效 "和 "位置 "在同一个命令。

bash awk sed
2个回答
4
投票
$ sed -E 's/,.*(valid|Located)/ \1/' ip.txt
c=one valid until: date
c=one Located: location

你可以把术语 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

2
投票

您不必依赖 validLocated用下面的命令,那里可以有任何字。

sed 's/,.*[^ ]\(   *[^ ][^:]*:\)/\1/'  file

或者,你可以强制匹配到 validLocated 使用

sed -E 's/,.*[^[:space:]]([[:space:]]{2,}(valid|Located))/\1/' file
sed -E 's/,.*\S(\s{2,}(valid|Located))/\1/' file     # If \s and \S are supported

哪儿 (valid|Located) 匹配 validLocated 字符序列。请注意,对于OR | 操作符,你需要在POSIX BRE模式中转义它,或者用 -E 选项,如上图所示。

参见 在线 sed 演示#1 和a 演示#2. 详情

  • , - 逗号
  • .* - 匹配任意0个或以上的字符
  • [^ ] - 然后找到一个非空格字符
  • \( *[^ ][^:]*:\) - 采集到的数据被归入第1组(\1) 2个或更多的空格,后面是一个非空格字符([^ ]),然后是0个或更多除 : ([^:]*),然后是一个 :.

您可以将空格替换为 \s (如果支持)或 [[:space:]] 来匹配任何空格,以及 [^ ][^[:space:]]\S (如果支持)。


1
投票

请你尝试以下,测试和编写与所示的样品。

awk -F'[, ]' 'match($0,/ +valid.*| +Located.*/){print $1,substr($0,RSTART,RLENGTH)}' Input_file

0
投票

我会删除所有的东西,直到多个连续的空格,假设左列没有双空格。

s/,.*     /     /
© www.soinside.com 2019 - 2024. All rights reserved.