Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用任意多个组拆分行_Bash_Sed - Fatal编程技术网

Bash 用任意多个组拆分行

Bash 用任意多个组拆分行,bash,sed,Bash,Sed,我有很多文件,有很多条目,每行一个条目,我必须通过greps和sed序列进行过滤。这些线的形状是一样的 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*\(.\

我有很多文件,有很多条目,每行一个条目,我必须通过greps和sed序列进行过滤。这些线的形状是一样的

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管道序列

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

使用awk可以执行以下操作:

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

a
x, y
u
v
w
s
p
q
r

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

!/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/ 倾向 P s/*\n// s/,\s*/\n/g :结束 这将根据需要生成相同的输出

我一直假设您不希望在左侧拆分任何逗号,因此

foo, bar --> baz
变成

foo, bar
baz
如果不是这样,也许如果您知道->的左边没有逗号,那么您就不需要p或s/*\n//,脚本非常简单

/\s*-->\s*/!n
s//\n/
s/,\s*/\n/g

你不能先把右边的u->v,w=>u->v\nw分开,然后去掉->?我也采取了类似的方法,没有考虑到。。。awk-F'*->*'-v OFS='\n'{gsub/,*/,\n,$2}1'是的,这很好,我已经用你的较短的awk命令编辑了我的答案。你可以用:awk'/->/{gsub/[\t]*->,[\t]*/,ORS}1'文件删除列-t。第一个版本,使用列,在x,y中插入一个额外的空格,使它成为x,y-第二个没有空格,所以我要用它:Thnx!尽管我个人更喜欢只使用sed的解决方案,但所选的解决方案稍微短一点,并且是一行程序。。。