Linux 替换出现的每个字符,除非它';这是一种模式

Linux 替换出现的每个字符,除非它';这是一种模式,linux,bash,sed,awk,grep,Linux,Bash,Sed,Awk,Grep,我想做点什么,但不知道怎么做。我有一个23个月的档案: : (blah :aaaaaaaaaaaaaaaaaaaa (bbbbbbbbbbbbbbbbbbbb : (bloh cccccccc dddddddd ... 等等。 我想做的是删除所有换行“\n”,除非\n后跟”:(“ 因此,最终文件将是: : (blah :aaaaaaaaaaaaaaaaaaaa (bbbbbbbbbbbbbbbbbbbb : (bloh cccccccc dddd

我想做点什么,但不知道怎么做。我有一个23个月的档案:

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

...
等等。 我想做的是删除所有换行“\n”,除非\n后跟”:(“
因此,最终文件将是:

: (blah  :aaaaaaaaaaaaaaaaaaaa (bbbbbbbbbbbbbbbbbbbb        
: (bloh  cccccccc  dddddddd
...
我有几个想法,第一个是:
-用sed删除所有“\n” -用替换所有:(“”\n:(“
但问题是文件是23MO,我不知道如何在一行23MO文件中管理它

第二个想法是:
-删除每个“\n”,除非它与模式“\n:(“
我不知道怎么做。
我仅限于使用bash perl sed grep和awk作为ressource。
我真的很想听听你的意见


祝你度过愉快的一天。

使用awk的一种方法:

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

我们可以通过定义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

您确实提到了perl,所以

perl -pe 'print "\n" if $.>1 && /^: \(/; chomp if ! eof' file
或v5.10及以上版本

perl -pE 'say "" if $.>1 && /^: \(/; chomp if ! eof' file
这可能适用于您(GNU-sed):


删除每个
\n
,除非它与模式“\n:”

不匹配,否则我发现GNU使用了另一个代码

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

你试过你的第一个想法了吗,有什么问题吗?
Mo
Monday
MegaObjects
?@endro:Megaoctet,和MegabyteI一样。我会运行一些测试,选择一个我喜欢的作为正式响应,如果它们都能工作的话:-)@cmh第一个想法不起作用,因为sed不喜欢打开23MB长的文件行,我得到一个错误。添加ORS是一个很好的方法,但可能不必要,我不知道为什么或如何,但它将我的文件放在同一行。@Kiwy这意味着你的示例输入不能代表你的实际输入。它在示例上有效,而不是在我的工作副本上不要理解我的例子有什么问题…为什么不只是一个带条件的
NR>1的块呢?这个块很好用,我只需要一种截断空间的方法,但我想我会解决它的。在print语句之前,
gsub(/[:space:]+/,”)
可以。我测试了您的两个脚本,它们只在一行上生成文件,而不是单独生成文件properly@Kiwy,该死,我在正则表达式中漏掉了一个冒号。我会修复它。我会测试它,但由于脚本将在检查点Modify RHEL上运行,我不确定它是否使用GNU:-)编辑:顺便说一下,在测试之后,它运行时没有结束,也没有生成输出。
sed  -n ':k;N;/\n:\s*(/{$!P;$p;D};s/\n/ /;$p;bk' file