繁体   English   中英

替换不同字符串的一部分(perl,bash)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM