使用 sed 删除双引号字符串中的逗号

问题描述 投票:0回答:2

我有一根绳子:

1,2,3,"test1,test2,test3",4,5,6

从中,我需要得到一个双引号内没有逗号的输出,如下所示:

1,2,3,"test1test2test3",4,5,6

我尝试了以下方法:

sed -i -e "s/,"([^,"]*)"//g" test.txt

但它返回了原始文本。

regex string sed
2个回答
1
投票

使用

sed

$ sed -Ei.bak ':a;s/("[^"]*),([[:alnum:]]+")/\1\2/;ta' input_file
1,2,3,"test1test2test3",4,5,6

0
投票

使用这个 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/

中的表达式

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.