[英]How to remove new lines within double quotes?
如何從文件中刪除"
內的新行?
例如:
"one",
"three
four",
"seven"
所以我想刪除three
和four
之間的\\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.