如何删除双引号内的新行?

时间:2015-03-19 16:59:47

标签: regex bash file ubuntu newline

如何从文件中删除"内的新行?

例如:

"one", 
"three
four",
"seven"

所以我想删除\nthree之间的four。我应该使用正则表达式,还是我必须使用程序读取每个字符的文件?

6 个答案:

答案 0 :(得分:16)

使用GNU awk(RT)来专门处理双引号字符串中的那些换行符并将它们留在它们之外的那些换行符:

gawk -v RS='"' 'NR % 2 == 0 { gsub(/\n/, "") } { printf("%s%s", $0, RT) }' file

这可以通过沿"个字符拆分文件并删除每个其他块中的换行符来实现。使用包含

的文件
"one",
"three
four",
12,
"seven"

这将给出结果

"one",
"threefour",
12,
"seven"

请注意,它不处理转义序列。如果输入数据中的字符串可以包含\",例如"He said: \"this is a direct quote.\"",那么它将无法正常工作。

答案 1 :(得分:5)

您可以打印以"开头的那些行。如果他们不这样做,请将其内容累积到变量中,然后再打印出来:

$ awk '/^"/ {if (f) print f; f=$0; next} {f=f FS $0} END {print f}' file
"one", 
"three four",
"seven"

由于我们始终打印上一个文本块,因此请注意END在处理完整文件后需要打印上一个存储的值。

答案 2 :(得分:1)

您可以使用sed

sed -r '/^"[^"]+$/{:a;N;/",/!ba;s/\n/ /g}' text

该命令搜索以双引号开头但不包含另一个双引号的行:/^"[^"]+$/

如果找到这样的行,则定义标签:a以标记循环的开始。使用N命令,我们将另一行从输入追加到当前缓冲区。如果新行再次不包含结束双引号/",/!,我们将再次使用a标记ba,除非我们找到结束报价。

如果找到引号,则所有换行符都会被空格s/\n/ /g替换,缓冲区将由sed自动打印。

答案 3 :(得分:1)

一个简单的解决方案:

#!/usr/bin/perl

use strict;
use warnings;

while (<DATA>) {
    chomp;
    if (m/^\"/) { print "\n"; }
    print;
}


__DATA__
"one", 
"three
four",
"seven"

但是,如果采用csv样式数据的特定情况,我建议使用名为Text::CSV的perl模块正确解析CSV - 并对待&# 39;带有换行符的元素&#39;前一行的一部分。

#!/usr/bin/perl

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new( { binary => 1 } );

open( my $input, "<", "input.csv" ) or die $!;

while ( my $row = $csv->getline($input) ) {
    for (@$row) {
        #remove linefeeds in each 'element'. 
        s/\n/ /g;
        #print this specific element ('naked' e.g. without quotes). 
        print;
        print ",";
    }
    print "\n";
}
close($input);

答案 4 :(得分:1)

在bash中测试

目的:用\ n

替换双引号中的换行符

适用于unix换行符(\ n),windows换行符(\ r \ n)和mac换行符(\ n \ r)

  

echo -e'“line1 \ nline2”'``

line1
line2
  

echo -e'“line1 \ nline2”'| gawk -v RS =''''NR%2 == 0 {gsub(/ \ r?\ n \ r?/,“\ n”)} {printf(“%s%s”,$ 0,RT)} “

line1\nline2

答案 5 :(得分:0)

 my $csv_in = 'Text::CSV'->new({binary => 1,
                             sep_char => ";",
                             auto_diag => 1
                             })
or die "CANNOT USE CSV: " . 'Text::CSV'->error_diag;

my $csv_out = 'Text::CSV'->new({ binary => 1,
                             eol => "\n",
                             sep_char => ";",
                             always_quote => 1,
                             auto_diag => 1
                             })
or die "CANNOT USE CSV: " . 'Text::CSV'->error_diag;

logger('LOG-3','PROCESSING FILE :'."\n".$source_feed_date_file);

try{
    # Inbound file reader with no encoding specified ==>
    open(my $CSV_FILE, '<', $source_feed_date_file) ;
    # Outbound file writer with UTF8 encoding ==>
    open(my $fh, '>:encoding(UTF-8)', $dest_feed_date_file) ;
    my $rx = 0;
    while (my $row = $csv_in->getline($CSV_FILE)) {
        s/\n|\r|\0|[^\x00-\x7F]//g for @$row;
        $csv_out->print ($fh, $row);

        if( $rx % 1000 == 0) {
            print "$rx \n";
        }
        $rx+=1;
    }
    print "Total Number Of Records processed:";
    print $rx ;
    my $e1 = time();
    printf("\n\nTime elapsed for %s : %.2f\n", $file,$e1 - $s1);
  } catch {
        my $e = shift;
        print $e;
        logger('LOG-4','PROCESSING FAILED FOR FILE :'."\n".$source_feed_date_file);
        exit 1;
    };

http://www.riveriq.com/blogs/2020/02/how-to-remove-new-lines-within-double-quotes