匹配正则表达式时替换上一个

时间:2014-01-08 22:46:14

标签: regex bash csv sed awk

我需要删除"行尾#34;当前行开始时前一行的数字不是数字^ [!0-9],基本上如果匹配,则追加到该行之前,我是一个sed& awk n00b,真的很喜欢他们顺便说一句。感谢

编辑:

$ cat file

1;1;1;text,1
2;4;;8;some;1;1;1;more
100;tex
t
broke

4564;1;1;"also
";12,2121;546465

$"脚本"文件

1;1;1;text,1
2;4;;8;some;1;1;1;more
100;text broke 
4564;1;1;"also";12,2121;546465

3 个答案:

答案 0 :(得分:2)

您没有发布任何样本输入或预期输出,所以这是一个猜测但听起来像您要求的那样:

$ cat file
a
b
3
4
c
d
$ awk '{printf "%s%s",(NR>1 && /^[[:digit:]]/ ? ORS : ""),$0} END{print ""}' file
ab
3
4cd

关于OPs新发布的输入:

$ awk '{printf "%s%s",(NR>1 && /^[[:digit:]]/ ? ORS : ""),$0} END{print ""}' file
1;1;1;text,1
2;4;;8;some;1;1;1;more
100;textbroke
4564;1;1;"also";12,2121;546465

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;$!N;s/\n([^0-9]|$)/\1/;ta;P;D' file

在模式空间中保留两行,如果第二行的开头为空或不以整数开头,请删除换行符。

答案 2 :(得分:0)

如果您的系统上有Ruby

  array = File.open("file").readlines
  array.each_with_index do |val,ind|  
    array[ind-1].chomp! if not val[/^\d/]    # just chomp off the previous item's \n
  end
  puts array.join

输出

# ruby test.rb 
1;1;1;text,1
2;4;;8;some;1;1;1;more
100;textbroke
4564;1;1;"also";12,2121;546465