当前一个没有以点结束时如何更换新线?

时间:2014-10-03 07:15:03

标签: bash awk sed grep

当前一行没有以点结束时,我试图用单个空格替换换行符。

我的意思是,这个输入:

 hello.
stack.
  overflow
 friends.
  this
  is
   a.
 test.

输出这个:

 hello.
stack.
  overflow friends.
  this is a.
 test.

我尝试过类似的事情:

sed 's/[^\.] *\\\n */ /g' input.txt

但似乎我无法匹配此案例中的换行符。而且我不知道如何排除这一点,因此它也不会被替换。

修改

通过此输入,所发布的解决方案均无效。 我做cat -vte让你知道没有任何奇怪的特征:

[jmrodriguez@zlpre1 ~]$ cat -vte /home/jmrodriguez/copytso.txt
       01  WE-ENTRADA.                                                          $
           03 WE-WILL-ROCK1           PIC X(6).                                      $
           03 WE-WILL-ROCK2           PIC X(3).                                      $
           03 WE-WILL-ROCK3            PIC X(7).                                      $
           03 WE-WILL-ROCK4     $
                             PIC S9(11)V99 COMP-3.                          $
           03 WE-WILL-ROCK5     PIC S9(11)V99 COMP-3.                          $
           03 MUST-WORKS     PIC S9(11)V99 COMP-3.                          $
           03 HELLO     PIC S9(11)V99 COMP-3.                          $
           03 ALL     PIC S9(11)V99 COMP-3.                          $
           03 YOU    PIC S9(11)V99 COMP-3.                          $
           03 FRIENDS    PIC S9(11)V99 COMP-3.                          $
           03 LOL    PIC S9(11)V99 COMP-3.                          $

7 个答案:

答案 0 :(得分:2)

你可以通过负面的背后隐藏在Perl中执行此操作。

perl -pe 's/(?<!\.)\n/ /g' file

OR

如果要在匹配的换行符后删除以下空格,请尝试以下操作。

$ perl -00pe 's/(?<!\.)\n\s*/ /g' file
 hello.
stack.
  overflow friends.
  this is a.
 test.

答案 1 :(得分:2)

使用sed:

sed ':l /[^.] *$/{N;s/ *\n */ /; bl}' input

输出:

 hello.
stack.
  overflow friends.
  this is a.
 test.

答案 2 :(得分:1)

使用此awk

awk 'p{sub(/^ */, "")} !/\. *$/{p=p $0 " "; next} {print p $0; p=""}' file
 hello.
stack.
  overflow friends.
  this is a.
 test.

答案 3 :(得分:0)

这也很方便(如果你可以使用额外的点):

$ awk '{gsub("\n|  *"," ");print $0RS}' RS='.'  infile                                   
 hello.
 stack.
  overflow  friends.
  this  is  a.
  test.
 .

答案 4 :(得分:0)

sed -n ':load
$ !{N;b load
   }
s/\([^.]\)\(\n\)/\1/g
p' YourFile 

首先预加载文件,而不是一次更改所有非点结束行

答案 5 :(得分:0)

使用xargs和awk

xargs | awk 'BEGIN{FS=".";OFS=".\n"}{$1=$1;print $0}'

答案 6 :(得分:0)

这可能适合你(GNU sed):

sed ':a;N;s/\([^.]\)\n/\1 /;ta;P;D' file 

保持2行的滚动窗口,并检查它们的交叉点是否为非周期。