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)
$ 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)