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

如何从文件中删除新行?

例如:

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

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

要特别处理双引号字符串中的换行符,并使用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命令,我们将另一行从输入附加到当前缓冲区。 如果新行再次不包含结尾的双引号/",/!我们再一次标记a使用ba除非我们找到结束报价。

如果发现所有的换行符被替换为空格s/\n/ /g ,缓冲区将被sed自动打印。

在bash中测试

目的:用\ n来替换双引号内的换行符

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

echo -e'“line1 \ nline2”“

一号线
 2号线

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

line1\nline2

一个简单的解决方案:

 #!/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' eg without quotes). print; print ","; } print "\n"; } close($input);