Bash 在图案之间连接线条

Bash 在图案之间连接线条,bash,join,lines,Bash,Join,Lines,我有一些带有模式的文件,这些模式由带有几行的{}分隔,我想找到两行,这两行上有特定的sintax,在我的源文件上,有时行显示如下: { some text size = 0 } {一些文本大小= 0} 或 {一些文本大小 =0} 及其他个案 {some text size = 0 } {some text size=0} 我想过滤我的源文件,加入那些符合分离条件的行,并在一行上转换它 又快又脏:(需要呆呆地看): 使用以问题文本为内容的文件进行测试: kent$ cat t

我有一些带有模式的文件,这些模式由带有几行的
{}
分隔,我想找到两行,这两行上有特定的sintax,在我的源文件上,有时行显示如下:

{ some text size =
          0 }
{一些文本大小=
0}

{一些文本大小
=0}
及其他个案

{some text size = 0 }
{some text size=0}
我想过滤我的源文件,加入那些符合分离条件的行,并在一行上转换它

又快又脏:(需要呆呆地看):

使用以问题文本为内容的文件进行测试:

kent$  cat test.txt
I have files with paterns delimited by {}, on my source files sometimes I have two lines like this:
{ some text size =
          0 }
or
{ some text size
         = 0 }
and other cases
{some text size = 0 }
{this should stay as it is

}

kent$  awk -v RS="\0" '{gsub(/ size\s*=\s*0\s*}/," size = 0}")}1' test.txt
I have files with paterns delimited by {}, on my source files sometimes I have two lines like this:
{ some text size = 0}
or
{ some text size = 0}
and other cases
{some text size = 0}
{this should stay as it is

}
Perl解决方案:

  • 简单命令行:

    perl -pe 'local $/; s/({.*size *(?:= *)?)\n/$1/g;' infile >outfile
    
  • 脚本:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    $filename = "/path/to/file"
    
    open FILE, "<$filename" or die $!;
    local $/;
    my $txt = <FILE>;
    close FILE;
    
    $txt =~ s/({.*size) *(?:= *\n|\n *=) *(0 *})/$1 = $2/g;
    
    open FILE, ">$filename" or die $!;
    print FILE $txt;
    close FILE;
    
    #/usr/bin/env perl
    严格使用;
    使用警告;
    $filename=“/path/to/file”
    打开文件“$filename”或骰子$!;
    打印文件$txt;
    关闭文件;
    

告诉我们您对如何解决这个问题的想法。
tr-d'\n'
足够吗?@anishsane很可能不够,因为源文件可能包含的不仅仅是这些行。“很可能”,“可能”->这个问题目前没有明确规定。@StuartGolodetz可能;)它不起作用!我的文件是数据库导出的结果。我有一个大文件,上面有几行,我想从一些表中清除一些值。我已经看过并制作了一个小脚本,其中包含两行我不想更改的代码。我发现的问题是,在某些系统上,文件是用分隔线创建的。听起来像是一个错误。请描述您真正想要实现的目标,比您以前提供的内容要多一些。效果很好,谢谢您的帮助!还有一个问题,我在一些文件中发现我的代码分成三行,我可以验证并连接这些行。分隔符总是{和}。@SergioPeres您是否尝试过在文件中使用我的awk行?无论你的图案被分割了多少条线,它都应该是有效的。
perl -pe 'local $/; s/({.*size *(?:= *)?)\n/$1/g;' infile >outfile
#!/usr/bin/env perl

use strict;
use warnings;

$filename = "/path/to/file"

open FILE, "<$filename" or die $!;
local $/;
my $txt = <FILE>;
close FILE;

$txt =~ s/({.*size) *(?:= *\n|\n *=) *(0 *})/$1 = $2/g;

open FILE, ">$filename" or die $!;
print FILE $txt;
close FILE;