将带有图案的线粘贴到上一行

时间:2018-06-19 14:06:52

标签: bash awk sed

我有一个结构文件

"name1";"surname1";23;44
"name2";"surname2 
www.so.org/443";56;33    
"name3";"surname3";223;4554
"name4";"surname5 
surname@so.net";77;889

我需要一个输出:

"name1";"surname1";23;44
"name2";"surname2 www.so.org/443";56;33    
"name3";"surname3";223;4554
"name4";"surname5 surname@so.net";77;889

这里的模式在行的开头是字母数字,而不是\“。我想将具有此模式的行粘贴到上面的行。

编辑:

我正在使用Debian稳定版。

我使用过sed,但我意识到它是流编辑器,我认为它无法将行粘贴到上一个(错误的)。 sed -e 's/^[a-z:A-Z]/ /g'只会帮助我找到正确的行。

我的第二次试用是在文本编辑器中进行的。我使用emacs打开了文件,并使用了M-x replace-regexp,并使用了^J[a-zA-Z]找到了对应的行,然后什么也没有替换。它完成了工作,但它也删除了第一个字符,我需要在单个空格后输入它。

2 个答案:

答案 0 :(得分:2)

这个awk单线应帮助您:

awk '{printf "%s%s",(/^"/&&NR>1?RS:""),$0}END{print ""}' file

问题的关键在于确定我们何时应该输出/打印换行符。

这种单线甚至适用于以下格式:

cat f
"name1";"surname1";23;44
"name2";"surname2
w
ww.
so.
org/
44
3";5
6;33
"name3";"surname3";223;4554
"name4";"surname5
surname@so.net";77;889


awk '{printf "%s%s",(/^"/&&NR>1?RS:""),$0}END{print ""}' f
"name1";"surname1";23;44
"name2";"surname2 www.so.org/443";56;33
"name3";"surname3";223;4554
"name4";"surname5 surname@so.net";77;889

答案 1 :(得分:1)

这可能对您有用(GNU sed):

  <?if $(var.Platform) = x64?>
    <!-- Program Files 64bit folder -->
    <Directory Id="ProgramFiles64Folder">
      <Directory Id="INSTALLFOLDER" Name="!(loc.ProductNameFolder)" />
    </Directory>
  <?else?>
    <!-- Program Files 32bit folder -->
    <Directory Id="ProgramFilesFolder">
      <Directory Id="INSTALLFOLDER" Name="!(loc.ProductNameFolder)" />
    </Directory>
  <?endif?>


</Directory>

如果当前行不包含3个或更多sed ':a;s/;/&/3;t;N;s/\n//;ta' file ,请追加下一行,删除引入的换行符并重复。