簡體   English   中英

如何刪除雙引號內的新行?

[英]How to remove new lines within double quotes?

如何從文件中刪除"內的新行?

例如:

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

所以我想刪除threefour之間的\\n 我應該使用正則表達式,還是必須使用程序讀取每個字符的文件?

要專門處理那些雙引號字符串中的換行符,並使用 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.\\"" ,那么它將無法按預期工作。

您可以打印以"開頭的那些行。如果沒有,請將其內容累積到一個變量中並稍后打印:

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

由於我們總是打印前一個文本塊,請注意END需要在處理完整文件后打印最后存儲的值。

您可以使用sed

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

該命令搜索以雙引號開頭但不包含另一個雙引號的行: /^"[^"]+$/

如果找到這樣的行,則定義標簽:a來標記循環的開始。 使用N命令,我們將另一行從輸入添加到當前緩沖區。 如果新行再次不包含結束雙引號/",/!我們再次使用ba標記a除非我們找到結束引號。

如果找到引號,所有換行符將替換為空格s/\\n/ /g並且緩沖區會由 sed 自動打印。

一個簡單的解決方案:

#!/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 - 並處理前一行的“帶換行符的元素”部分。

#!/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);

在 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

 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM