如何从文件中删除新行?
例如:
"one", "three four", "seven"
所以我想删除three
, four
之间的\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);