我想用几行替换csv文件中的文本:
输入:
any text,"textA, textB",any text
输出继电器:
any text, textA; textB,any text
(即:如果它位于两个引号之间,则用分号替换逗号,并删除引号)
我为textA和textB尝试了sed和通配符,但是无法在输出文件中打印textA和textB。 谢谢你的帮助!
答案 0 :(得分:1)
$ sed -r 's/"([^"]+),([^"]+)"/\1;\2/g' file
any text,textA; textB,any text
答案 1 :(得分:0)
您可以使用gnu-awk:
cat file
any text,"textA, textB",any text
awk -v FPAT='"[^"]*"|[^,]*' -v OFS=, '{for(i=1; i<=NF; i++) {
gsub(/,/, ";", $i); gsub(/"/, "", $i)}} 1' file
any text,textA; textB,any text
答案 2 :(得分:0)
您可以使用sed来匹配引号,然后捕获组以在第一个引用到逗号之后抓取文本(所有文本不是引号而不是逗号([^",]*
),然后逗号后的文字直到收尾报价。
sed 's/\("\)\([^",]*\)\([,]\)\([^",]*\)\("\)/\2;\4/g' <<< 'any text,"textA, textB",any text'
答案 3 :(得分:0)
这可能适合你(GNU sed):
#inside-table span {
position: relative;
top: 50%;
left: 50%;
}
如果线路保释中没有sed -r ':a;/"/!b;s//\n/;s//\n/;h;y/,/;/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2 \1/;ta' file
。否则,用换行符替换"
的前两次出现,并在保留空间中复制。将任何"
转换为模式空间中的,
,然后将保留空间附加到模式空间,并使用模式匹配重新排列该行。如果替换成功,则重复直到所有;
都被替换。
N.B。这预先假定所有"
都匹配。
答案 4 :(得分:0)
使用(标准)T ext::ParseWords模块的Perl解决方案。
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Text::ParseWords;
while (<DATA>) {
my @data = map { s/,/;/g; $_ } parse_line(',', 0, $_);
print join ',', @data;
}
__DATA__
any text,"textA, textB",any text