gpt4 book ai didi

regex - 如何删除匹配模式的字符串中的前缀、后缀并使用 sed 在字符上拆分?

转载 作者:太空狗 更新时间:2023-10-29 11:28:57 26 4
gpt4 key购买 nike

我有以下字符串,它是 bash 中 cassandra 查询的输出

col1|col2|col3+++++++++++A|1|a B|2|b C|3|c D|4|d  (3 rows)

我想拆分这个字符串,以便删除开头的字符串直到最后一个 + 符号,然后删除尾端,即 (XYZ rows) .

因此,字符串变为 A|1|a B|2|b C|3|c D|4|d。现在,我想将这个字符串拆分成多个数组,如下所示

A 1 a 
B 2 b
C 3 c
D 4 d

这样我就可以使用 for 循环遍历每一行来进行一些处理。行数可以变化。

我如何使用 sed 或 grep 执行此操作?

我第一次试过这个,但没有成功:

echo $string | sed 's/([0-9])rows//' | sed 's/[^+]//'

注意:列字符串中可以有多个空格例如:写入文件时 CQL 查询的输出是

 topic   | partition | offset
---------+-----------+--------
topic_2 | 31 | 4
topic_2 | 30 | 4
topic_2 | 29 | 4
topic_2 | 28 | 4
topic_2 | 27 | 4
topic_2 | 26 | 4
topic_2 | 25 | 4
topic_2 | 24 | 4
topic_2 | 23 | 4
topic_2 | 22 | 4
topic_2 | 21 | 4
topic_2 | 20 | 4
topic_2 | 19 | 4
topic_2 | 18 | 4
topic_2 | 17 | 4
topic_2 | 16 | 4
topic_2 | 15 | 4
topic_2 | 14 | 4
topic_2 | 13 | 4
topic_2 | 12 | 4
topic_2 | 11 | 4
topic_2 | 10 | 4
topic_2 | 9 | 4
topic_2 | 8 | 4
topic_2 | 7 | 4
topic_2 | 6 | 4
topic_2 | 5 | 4
topic_2 | 4 | 4
topic_2 | 3 | 4
topic_2 | 2 | 4
topic_2 | 1 | 4
topic_2 | 0 | 4

(32 rows)

最佳答案

$ sed 's/[^+]*[+]*\(.*[^ ]\) *(.*)$/\1/;y/ |/\n /' <<< 'col1|col2|col3+++++++++++A|1|a B|2|b C|3|c D|4|d  (3 rows)'
A 1 a
B 2 b
C 3 c
D 4 d

替换执行以下操作(向potong 致敬,指出如何摆脱另一个替换):

s/
[^+]* # Match non-plusses
[+]* # Followed by plusses
\( # Capture the next group
.* # Any characters (greedily)
[^ ] # that end with a non-space
\) # End of capture group
* # Spaces
(.*) # Followed by whatever in parentheses
$/\1/ # Replace all that by the capture group

导致这个中间阶段:

$ sed 's/[^+]*[+]*\(.*[^ ]\) *(.*)$/\1/' <<< 'col1|col2|col3+++++++++++A|1|a B|2|b C|3|c D|4|d  (3 rows)'
A|1|a B|2|b C|3|c D|4|d

转换 (y///) 将所有空格转换为换行符并将管道转换为空格。

分隔行以外的空格

如果列中有空格,我们假设每个条目都具有格式

[spaces]entry[spaces]

即,每个条目恰好有两组空格,我们必须用另一个替换替换转换 y///

s/\([^ |]\)\( \+[^ |]\)/\1\n\2/g

这将查找不是 空格或竖线和后跟非空格或竖线的空格,并在这些空格前插入一个换行符。结果:

$ var='col1 | col2 | col3 +++++++++++ A | 1 | a B | 2 | b C | 3 | c D | 4 | d (3 rows)'
$ sed 's/[^+]*[+]*\(.*[^ ]\) *(.*)$/\1/;s/\([^ |]\)\( \+[^ |]\)/\1\n\2/g' <<< "$var"
A | 1 | a
B | 2 | b
C | 3 | c
D | 4 | d

关于regex - 如何删除匹配模式的字符串中的前缀、后缀并使用 sed 在字符上拆分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35054756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com