如何删除匹配模式的字符串中的前缀,后缀并使用sed拆分字符?

use*_*612 2 regex linux grep sed

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

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

我想拆分这个字符串,以便在开头删除字符串,直到最后一个+符号,然后删除尾端,即(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
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用for循环迭代每一行来进行一些处理.行数可以变化.

我怎么能用sed或grep做到这一点?

我尝试了第一次通过,但它不起作用:

echo $string | sed 's/([0-9])rows//' | sed 's/[^+]//'
Run Code Online (Sandbox Code Playgroud)

注意:列字符串中可以有多个空格ex:写入文件时输出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)
Run Code Online (Sandbox Code Playgroud)

Ben*_* W. 5

$ 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
Run Code Online (Sandbox Code Playgroud)

替换做了以下(帽子提示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
Run Code Online (Sandbox Code Playgroud)

导致这个中间阶段:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

除了分隔行的空格之外的空格

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

[spaces]entry[spaces]
Run Code Online (Sandbox Code Playgroud)

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

s/\([^ |]\)\( \+[^ |]\)/\1\n\2/g
Run Code Online (Sandbox Code Playgroud)

这将查找不是空格或管道的空格,后面没有空格或管道,并在这些空格之前插入换行符.结果:

$ 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
Run Code Online (Sandbox Code Playgroud)