使用sed替换较大的文本体内的分隔列表

时间:2013-12-30 19:56:08

标签: regex list sed variable-length

我有一个大文件,在方括号中有许多可变长度数字列表实例,每行最多一个列表,列表从不为空,例如:

[1,45,54,78]或[32]

我想摆脱方括号和逗号,例如:

1 45 54 78或32

我可以在sed:

中将它们与此正则表达式成功匹配
\\[\\([0-9]*\\)\\(, \\([0-9]*\\)\\)*\\]

但我不知道如何使用组号来引用我想要的组,例如这样做的:

sed  's/\\t\[\\([0-9]*\\)\\(, \\([0-9]*\\)\\)*\\]/\\t\\1 \\3/g'

只会导致目标文件获取列表中的第一个和最后一个数字。

(我确实使用awk解决了我的问题,但我想知道是否可以使用sed完成)

有没有办法在sed中引用可变数量的组?

3 个答案:

答案 0 :(得分:2)

怎么样:

sed 's/\[([\d ,]+)\]/\1/g' | sed 's/,//g'

两个单独的命令 - 首先提取“方括号内的东西”,第二个删除逗号。

答案 1 :(得分:1)

awk应该:

awk '{gsub(/[][,]/,x)}1' file
1 45 54 78 or 32

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r ':a;/\[([0-9]+(, )*)+\]/!b;s//\n&\n/;h;s/[][,]//g;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/;ba' file

找到模式,在任一侧用换行符标记它,并将整行复制到保留空间。然后删除模式中的括号和逗号,并将更改后的原始模式重新组合,然后重复,直到找不到更多模式。