replace字符的每一个出现,除非它是在一个模式中

我试图做一些事情,但我不知道该怎么做。 我有一个23 Mo的文件:

: (blah :aaaaaaaaaaaaaaaaaaaa (bbbbbbbbbbbbbbbbbbbb : (bloh cccccccc dddddddd ... 

等等。 除非\ n后面跟着“: ”,否则所有的行都是“\ n
所以最后的文件是:

 : (blah :aaaaaaaaaaaaaaaaaaaa (bbbbbbbbbbbbbbbbbbbb : (bloh cccccccc dddddddd ... 

我有几个想法做到这一点,第一个是:
– 用sed删除所有“\ n”
– 全部replace“:(” by “\ n:(”
但问题是文件是23MO,我不知道如何pipe理这个23mo的一行文件。

第二个想法,但我仍然不知道如何去做,是:
– 删除每个“\ n”,除非匹配模式“\ n:(”
我不知道如何。
我仅限于bash perl sed grepawk作为资源。
我真的很喜欢你的投入。

祝你今天愉快。

我们可以通过定义awk的记录和字段分隔符变量来完成大部分的工作:

 awk 'NR==1 {next} {$1=$1; print ": (" $0}' RS=': \(' FS='\n' OFS="" filename 

由于文件以我们定义的记录分隔符开始,所以我们跳过了一个空的第一条记录。

同样的程序,更可读

 awk ' BEGIN {FS="\n"; OFS=""; RS=": \("; prefix=": ("} NR==1 {next} {$1=$1; print prefix $0} ' filename 

awk一种方法:

 $ awk '/^: [(]/&&NR>1{printf "%s",ORS}{printf "%s",$0}END{printf "%s",ORS}' file : (blah :aaaaaaaaaaaaaaaaaaaa (bbbbbbbbbbbbbbbbbbbb : (bloh cccccccc dddddddd 

这可能适用于你(GNU sed):

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

删除每个\n除非它与模式“\ n:”不匹配

我发现了GNU sed的另一个代码。

 sed -n ':k;N;/\n:\s*(/{$!P;$p;D};s/\n/ /;$p;bk' file 

你没有提到perl,所以…

 perl -pe 'print "\n" if $.>1 && /^: \(/; chomp if ! eof' file 

或者v5.10及以上

 perl -pE 'say "" if $.>1 && /^: \(/; chomp if ! eof' file