![](/img/trans.png)
[英]Using bash/tail/perl/alias for easy highlighting of different strings
[英]replace part of different strings (perl, bash)
我想在多行中替换csv文件中的文本:
输入:
any text,"textA, textB",any text
输出继电器:
any text, textA; textB,any text
(即:如果逗号位于两个引号之间,请用分号替换逗号,并同时删除引号)
我尝试对textA和textB使用sed和通配符,但是无法在输出文件中打印textA和textB。 谢谢你的帮助!
$ sed -r 's/"([^"]+),([^"]+)"/\1;\2/g' file
any text,textA; textB,any text
您可以使用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
您可以使用sed来匹配引号,然后捕获组以将第一个引号后的文本捕获为逗号(所有不是引号且不是逗号的文本( [^",]*
),然后是逗号,直到结束报价。
sed 's/\\("\\)\\([^",]*\\)\\([,]\\)\\([^",]*\\)\\("\\)/\\2;\\4/g' <<< 'any text,"textA, textB",any text'
这可能对您有用(GNU sed):
sed -r ':a;/"/!b;s//\n/;s//\n/;h;y/,/;/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2 \1/;ta' file
如果行中没有"
,请使用紧急情况。否则,请用换行符替换前两次出现的"
,并在保留空间中进行复制。 翻译任何,
到;
在模式空间中,然后将保留空间添加到模式空间,并使用模式匹配重新排列行。 如果替换成功,则重复进行直到所有"
都已替换。
注意:这假定所有"
都匹配。
使用(标准)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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.