ODe*_*lta 2 regex bash perl awk tr
更新:请记住,正则表达式是我唯一的选择。
更新 2:实际上,我也可以使用基于 bash 的解决方案。
尝试用 perl 正则表达式中的逗号替换双引号之间的管道(可以多个)
例子
continuer|“名字”|123|12412|2020年10月21日|“3|7”||是|否|否|
预期输出(3和7用逗号分隔)
continuer|“名字”|123|12412|2020年10月21日|“3,7”||是|否|否|
可能有更多的数字,也可能不仅仅是这两个数字d\|d。可能是这样"3|7|2",并且正确的输出必须是"3,7,2"这样的。我尝试过以下方法
cat <filename> | perl -pi -e 's/"\d+\|[\|\d]+/\d+,[\|\d]+/g'
Run Code Online (Sandbox Code Playgroud)
但它只是放置实际的字符串d+等...
我非常感谢你的帮助。蒂
如果它必须是正则表达式,这里是一个更简单的正则表达式
\nperl -wpe\'s/("[^"]+")/ $1 =~ s{\\|}{,}gr /eg\' file\nRun Code Online (Sandbox Code Playgroud)\n不是防弹的,但它应该适用于所示的用例。\xe2\x80\xa0
\n解释。使用/e修饰符,替换侧将被评估为代码。在那里,正则表达式在$1under上运行/r,使得原来的 ( $1) 不变;$N是只读的,因此我们无法更改$1,因此无法s///对其运行“正常”。使用此修饰符将返回更改后的字符串,如果没有更改则返回原始字符串。正如所命令的那样。
一旦经过足够好的测试,-i如果需要,可以添加“就地”更改输入文件。
我必须补充一点,我认为没有理由至少这部分工作不能使用 CSV 解析器完成......
\n感谢 ikegami 提供改进版本
\nperl -wpe\'s/"[^"]+"/ $& =~ tr{|}{,}r /eg\' file\nRun Code Online (Sandbox Code Playgroud)\n更简单,无需捕捉,tr速度更快
\xe2\x80\xa0使用问题中的字符串进行测试,仅扩展至此
\n\ncon|"F,N"|12|10/21|"3|7"||是|"2||4|12"|"a|b"|否|""|结束|\n\n
我会使用CSV 解析器,而不是正则表达式:
#!/usr/bin/env perl
use warnings;
use strict;
use Text::CSV_XS;
my $csv = Text::CSV_XS->new({ binary => 1, sep_char => "|"});
while (my $row = $csv->getline(*ARGV)) {
@$row = map { tr/|/,/r } @$row;
$csv->say(*STDOUT, $row);
}
Run Code Online (Sandbox Code Playgroud)
例子:
$ perl demo.pl input.txt
continuer|"First, Name"|123|12412|10/21/2020|3,7||Yes|No|No|
Run Code Online (Sandbox Code Playgroud)
更冗长,但也更强大并且更容易理解。
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |