我有很多文件有很多条目(每行一个条目),我必须通过一系列的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管道序列。
答案 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//