sed连接在一起

时间:2011-10-21 16:03:09

标签: regex linux sed

什么是sed(或其他工具)命令将文件中的行连接在一起,而不是以字符“0”结尾?

我会有像这样的行

  

412 | n |领导建筑材料|||||||||| d | d | 20 || 0

需要单独留下,然后我会有这样的行(例如3行,但只有一行w / 0)

  

107 | n |结扎工具|||||结扎工具

     

||||| d | d | 0 || 0

需要加入/组合成一行

  

107 | n |结扎工具|||||结扎工具||||| d | d | 0 || 0

5 个答案:

答案 0 :(得分:45)

 sed ':a;/0$/{N;s/\n//;ba}'

在循环(分支ba到标签:a)中,如果当前行以0(/0$/)结尾,则追加下一行(N)并删除内部换行符(s/\n//)。

<强> AWK:

awk '{while(/0$/) { getline a; $0=$0 a; sub(/\n/,_) }; print}'

<强>的Perl:

perl -pe '$_.=<>,s/\n// while /0$/'

<强> bash中:

while read line; do 
    if [ ${line: -1:1} != "0" ] ; then 
        echo $line
    else echo -n $line
fi
done 

答案 1 :(得分:8)

awk也可能很短:

awk '!/0$/{printf $0}/0$/'

试验:

kent$  cat t
#aasdfasdf
#asbbb0
#asf
#asdf0
#xxxxxx
#bar

kent$  awk '!/0$/{printf $0}/0$/' t
#aasdfasdf#asbbb0
#asf#asdf0
#xxxxxx#bar 

答案 2 :(得分:3)

这个answer的评分令人惊讶;s(考虑到OP规范:sed join lines together,这对于sed替换的惊奇表情符号是有意的)。

submission's最后评论

  

“如果是这样,请查看@ninjalj提交的内容”

还建议检查same answer

即。使用sed ':a;/0$/{N;s/\n//;ba}'逐字检查

进行检查
sed ':a;/0$/{N;s/\n//;ba}'
 does
 no one
 ie. 0
 people,
 try
 nothing,

 ie. 0
 things,
 any more,
 ie. 0
 tests?

          (^D aka eot 004 ctrl-D ␄  ... bash generate via: echo ^V^D)

不会给(做测试;):

 does no one ie. 0
 people, try nothing, ie. 0
 things, any more, ie. 0
 tests?          (^D aka eot 004 ctrl-D ␄  ... bash generate via: echo ^V^D)

要使用此功能:

sed 'H;${z;x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'

或:

sed ':a;/0$/!{N;s/\n//;ba}'

sed ':a;/0$/{N;s/\n//;ba}'

注意:

sed 'H;${x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'

不使用分支和 与...相同:

sed '${H;z;x;s/\n//g;p;};/0$/!{H;d;};/0$/{H;z;x;s/\n//g;}'
  • H开始所有序列
  • d在当前行短路进一步脚本命令执行并开始下一个周期,因此/0$/!后面的地址选择器只能是/0$/!!所以地址选择器为 /0$/{H;z;x;s/\n//g;}是多余的,不需要。
  • 如果一行不以0结尾,则将其保存在保留空间中 /0$/!{H;d;}
  • 如果一条线以0结尾,也将它保存,然后打印冲洗(双重填充,即清除和线对齐)
    /0$/{H;z;x;s/\n//g;}
  • NB ${H;z;x;s/\n//g;p;}使用带有额外/0$/ ...的{​​{1}}命令强制执行最终打印,并使用现在不必要的p(以清空和重置模式空间,如s /。 * //)

答案 3 :(得分:2)

如果以0存储结束,则删除换行符..

sed '/0$/!N;s/\n//'

答案 4 :(得分:2)

典型的隐秘Perl单线:

perl -pe 'BEGIN{$/="0\n"}s/\n//g;$_.=$/'

这使用序列“0 \ n”作为记录分隔符(根据您的问题,我假设每一行都应以零结尾)。那么任何记录都不应该有内部换行符,因此删除它们,然后打印该行,追加被删除的0和换行符。

您的问题的另一个问题是确保每一行有17个以管道分隔的字段。这并不假设第17个字段值必须为零。

awk -F \| '
    NF == 17 {print; next}
    prev {print prev $0; prev = ""}
    {prev = $0}
'