SED-组合匹配的正则表达式行以生成csv文件

时间:2014-09-11 23:49:22

标签: regex bash sed

我想知道是否可以使用sed来创建一个csv文件,方法是将多条线组合在一条由逗号分隔的单行上。

例如,我编写了一个sed语句来检索我想要的行。

sed -n -e '/ENTITIES/,/ENDSEC/p' | sed -n -e '/  8/{n;p;}' -e '/ 10/{n;p;}' -e '/ 20/{n;p;}' -e '/ 11/{n;p;}' -e '/ 21/{n;p;}' < Test.txt > out.csv

产生输出;

 0
 4.93
 9.04
 27.9
 23.4
 0
 34.56
 0.77
 66.65
 19.50
 0
 55.26
 47.29
 53.42
 19.75
 0
 -18.22
 44.35
 19.74
 53.28

但我希望它输出;

 0,4.93,9.04,27.9,23.4
 0,34.56,0.77,66.65,19.50
 0,55.26,47.29,53.42,19.75
 0,-18.22,44.35,19.74,53.28

无论如何没有管道吗? Id而不是调用另一个命令,因为我处理的文件超过100密耳行左右。

提前感谢您的帮助!

要添加,这是输入文件的一部分;

更多东西

AcDbBlockEnd
  0
ENDSEC
  0
SECTION
  2
ENTITIES
  0
LINE
  5
1B1
330
1F
100
AcDbEntity
  8
0
100
AcDbLine
 10
4.933855223957067
 20
9.042372500389475
 30
0.0
 11
27.92566226775641
 21
23.49207557886149
 31
0.0
  0
LINE
  5
1B2
330
1F
100
AcDbEntity
  8
0
100
AcDbLine
 10
34.56437535704545
 20
0.778745874786317
 30
0.0
 11
66.65564369957746
 21
19.50612180407816
 31
0.0
  0
LINE
  5
1B3
330
1F
100
AcDbEntity
  8
0
100
AcDbLine
 10
55.26446832764479
 20
47.29118282642324
 30
0.0
 11
53.42718194719286
 21
19.75092411476788
 31
0.0
  0
LINE
  5
1B4
330
1F
100
AcDbEntity
ENDSEC
  0

以下更多内容。

3 个答案:

答案 0 :(得分:4)

像这样的东西可能是你正在寻找的东西,但正如杰拉帕所说,没有看到输入它有点猜测。

sed -n '
  /ENTITIES/,/ENDSEC/p
  /  8/{n;h}
  / 10/{n;H}
  / 20/{n;H}
  / 11/{n;H}
  / 21/{n;H;g;s/\n/,/g;p}
' Test.txt > out.csv

评论:

sed -n '
  /ENTITIES/,/ENDSEC/p
  /  8/{n;h}       # store next line in hold space
  / 10/{n;H}       # append next line to hold space (after newline)
  / 20/{n;H}       # ditto
  / 11/{n;H}       # ditto
  / 21/{n;H;       # ditto
        g;         # put hold space into pattern space
        s/\n/,/g;  # substitute commas for newlines
        p          # print it
       }
' Test.txt > out.csv

答案 1 :(得分:1)

将你的sed传输到

sed 'your long sed commnand' | paste -d, - - - - -

结果将是

0,4.93,9.04,27.9,23.4
0,34.56,0.77,66.65,19.50
0,55.26,47.29,53.42,19.75
0,-18.22,44.35,19.74,53.28

答案 2 :(得分:0)

感谢ooga!在我缺乏对持有空间与模式空间的理解之前,现在它已经变得清晰了!

sed -n '
    /ENTITIES/,/ENDSEC/{
         /  8/{n;h;};
         / 10/{n;H;};
         / 20/{n;H;};
         / 11/{n;H;};
         / 21/{n;H;g;s/\n/,/g;p};
    }
' < Test.dxf > out.csv