如何使用sed仅替换匹配正则表达式的行?

时间:2013-12-21 19:19:51

标签: unix sed

我有一个由以下形式的字符串组成的文件:

21-11-2000
1
2
3
4
5
22-11-2000
1
2
3
4
5

我希望将其转换为:

21-11-2000,1,2,3,4,5
22-11-2000,1,2,3,4,5

因此我会使用sed两次。首先用匹配[0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]的每一行用逗号替换行尾,然后用另一个sed扫描替换从行开头到逗号不匹配相同模式的每一行。

会有更简单的方法吗?

5 个答案:

答案 0 :(得分:2)

使用

awk '{
    if ($1 ~ "^[0-9]+-[0-9]+-[0-9]+") {
        k=$1
        next
    }
    arr[k]=arr[k]","$1
}
END{for (a in arr) print a arr[a]}
' file

答案 1 :(得分:2)

以下是一些awk变体:

awk -F- '{printf (NF>2?RS:",")"%s",$0}' t

21-11-2000,1,2,3,4,5
22-11-2000,1,2,3,4,5

如果每条记录总是6行,那么这是最好的:

awk 'NR%6{printf "%s,",$0;next}1' t
21-11-2000,1,2,3,4,5
22-11-2000,1,2,3,4,5

答案 2 :(得分:2)

这可能适合你(GNU sed):

sed '/-/{:a;$!N;/\n[0-9]$/s/\n/,/;ta};P;D' file

答案 3 :(得分:1)

您可以使用哪些工具?如果您的输入文件与您所描述的完全一致,则以下单行将起作用。

cat input | awk 1 ORS=',' | perl -pi -e 's/(\d),(\d+-|$)/$1\n$2/g'

答案 4 :(得分:0)

使用sed(不仅仅是数字行)

sed '/-/{:a;N;/\n[^-]*$/s/\n/,/;ta};P;D' file