替换每个出现的char,除非它处于模式中

Kiw*_*iwy 2 linux bash awk grep sed

我想做点什么,但我不知道该怎么做.我有一个23 Mo的文件:

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

...
Run Code Online (Sandbox Code Playgroud)

等等.我喜欢做的是删除所有行跳转"\n",除非\n后跟":("
所以最终文件将是:

: (blah  :aaaaaaaaaaaaaaaaaaaa (bbbbbbbbbbbbbbbbbbbb        
: (bloh  cccccccc  dddddddd
...
Run Code Online (Sandbox Code Playgroud)

我有几个想法要做,第一个是:
- 用sed 删除所有"\n"
- 替换所有":(" by "\n :("
但问题是文件是23MO我不知道如何在23mo的一行文件上管理这个.

第二个想法,但我仍然不知道如何做,是:
- 删除每个"\n",除非它匹配模式"\n :("
我不知道如何.
我只限于bash perl sed grep和awk作为ressource.
我真的很想得到你的意见.

祝你今天愉快.

gle*_*man 7

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

awk 'NR==1 {next} {$1=$1;  print ": (" $0}' RS=': \(' FS='\n' OFS="" filename
Run Code Online (Sandbox Code Playgroud)

由于文件以我们定义的记录分隔符开头,因此我们会跳过一条空的第一条记录.

相同的程序,更具可读性

awk '
    BEGIN {FS="\n"; OFS=""; RS=": \("; prefix=": ("}
    NR==1 {next} 
    {$1=$1; print prefix $0}
' filename
Run Code Online (Sandbox Code Playgroud)