我有一根绳子:
1,2,3,"test1,test2,test3",4,5,6
从中,我需要得到一个双引号内没有逗号的输出,如下所示:
1,2,3,"test1test2test3",4,5,6
我尝试了以下方法:
sed -i -e "s/,"([^,"]*)"//g" test.txt
但它返回了原始文本。
使用
sed
$ sed -Ei.bak ':a;s/("[^"]*),([[:alnum:]]+")/\1\2/;ta' input_file
1,2,3,"test1test2test3",4,5,6
使用这个 Perl 一行代码:
perl -pe 's{"[^"]*"}{ $s = $&; $s =~ tr/,//d; $s }e' in_file > out_file
或就地修改文件:
perl -i.bak -pe 's{"[^"]*"}{ $s = $&; $s =~ tr/,//d; $s }e' in_file
Perl 单行代码使用这些命令行标志:
-e
:告诉 Perl 查找内联代码,而不是在文件中。-p
:一次循环输入一行,默认将其分配给$_
。每次循环迭代后添加 print $_
。-i.bak
:就地编辑输入文件(覆盖输入文件)。覆盖之前,请在其名称后附加扩展名 .bak
来保存原始文件的备份副本。如果您想跳过写入备份文件,只需使用 -i
并跳过扩展名即可。
s/PATTERN/REPLACEMENT/
:将 PATTERN
替换为 REPLACEMENT
。"[^"]*"
:遇到的第一个双引号字符串。 [^"]
表示具有除双引号之外的任何字符 other 的字符类。$s = $&;
:将模式匹配分配给新变量,$s
。$s =~ tr/,//d;
: 删除变量$s
中的所有逗号。$s
:在块末尾单独使用时表示“返回$s
的值”(在上述更改之后)。
正则表达式使用此修饰符:
/e
:将 REPLACEMENT
计算为 s/PATTERN/REPLACEMENT/
中的表达式
另请参阅: