与任意多个组分开

时间:2017-03-21 10:36:37

标签: bash sed

我有很多文件有很多条目(每行一个条目),我必须通过一系列的greps和seds进行过滤。这些行的形式为

a
x, y
u --> v, w
s --> p, q, r

其中一个步骤是拆分包含-->的行,使得左侧和右侧的每个逗号分隔条目(其中可以有任意多条)最终在不同的行上。即,上述行应成为:

a
x, y
u
v
w
s
p
q
r

快速完成左侧与右侧的分离:

echo "u --> v, w" | sed 's/\(.\+\)\s*\-\->\s*\(.\+\)/\1\n\2/'

给我

u
v, w

但这似乎是一个死胡同,因为我无法通过管道来分割逗号,因为这也会分割x, y

所以,我想知道是否有办法在sed命令中完全拆分这些行,或者我是否必须转向,例如,awk(或者只是转到Python)?最好保留一个bash管道序列。

3 个答案:

答案 0 :(得分:5)

awk '/-->/ {gsub(/-->|,/,RS)}1' inputfile|column -t
a
x,  y
u
v
w
s
p
q
r
<或者>正如Anubhav建议避免管道:

awk '/-->/ {gsub(/[ \t]*(-->|,)[ \t]*/ , ORS)} 1' inputfile

答案 1 :(得分:3)

使用awk你可以这样做:

awk -F'[ \t]*-->[ \t]*' -v OFS='\n' '{gsub(/,[ \t]*/, OFS, $2)} 1' file

a
x, y
u
v
w
s
p
q
r

答案 2 :(得分:2)

您可以通过在匹配-->时创建命令组来执行此操作。在此组中,您用换行符替换-->,打印到换行符,丢弃您打印的部分,然后替换其余部分中的逗号:

#!/bin/sed -f

/\s*-->\s*/{
s//\n/
P
s/.*\n//
s/,\s*/\n/g
}

结果:

a
x, y
u
v
w
s
p
q
r

或者,在GNU sed中,您可以使用T命令跳过右侧的处理,除非您匹配并替换-->

#!/bin/sed -f

s/\s*-->\s*/\n/
Tend
P
s/.*\n//
s/,\s*/\n/g
:end

根据需要产生相同的输出。

我一直认为你不想在左手边分割任何逗号,所以

foo, bar --> baz

变为

foo, bar
baz

如果情况并非如此(如果您知道-->左侧没有逗号),那么您就不需要P或{{1这个脚本就像

一样简单
s/.*\n//