我有一个文本文件如下:
test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
如何用分号替换逗号, 从第二个开始(并继续到最后一个)?
我想得到如下输出:
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
答案1
这可以用这个来完成,
$ sed -e 's/,/;/g' -e 's/;/,/1' infile
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
解释
s/,/;/g
将所有出现的 替换,
为;
s/;/,/1
将第一次出现的 替换;
为,
如果你有 GNU sed
,你也可以尝试这个简单又好用的,
sed 's/,/;/2g' infile
答案2
如果输入中可能已经有分号,我们必须小心:
$ sed 's/,/\n/g; s/\n/,/; s/\n/;/g' input
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
由于 sed 逐行读取输入,因此正常输入中不会有换行符。因此,我们可以用换行符替换所有逗号,我们知道不会出现混乱。接下来我们将第一个换行符恢复为逗号。最后,我们用分号替换所有剩余的换行符。
更详细地说:
s/,/\n/g
用换行符替换所有逗号。s/\n/,/
用逗号替换第一个换行符。s/\n/;/g
用分号替换所有剩余的换行符。
答案3
使用awk
:
awk '{gsub(",", ";"); sub(";", ","); print}' file.txt
gsub(",", ";")
全部替换,
为;
sub(";", ",")
将第一个替换;
为,
例子:
% cat file.txt
test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
% awk '{gsub(",", ";"); sub(";", ","); print}' file.txt
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
答案4
$ cat ip.txt
test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
test15
$ perl -F, -ane 'print "$F[0]"; print ",".join(";",@F[1..$#F]) if($#F > 0)' ip.txt
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
test15
其他方式:
perl -F'/(,)/,$_,2' -ane '$F[2] =~ s/,/;/g; print @F'
/(,)/,$_,2
$_
根据使用的,
方法将(输入行)分成两部分(,)
,它还会捕获分隔符并产生三个元素,如下所述$F[0]
获取第一个字段,如果存在则将$F[1]
获取,
$F[2]
获取剩余字段(如果存在)
还有一种方式,模仿sed 's/,/;/2g'
perl -pe '$c=0; s/,/++$c<2 ? $& : ";"/ge' ip.txt
- 为每一行初始化计数器
- 替换时,根据需要检查计数器值
- 修饰符
e
允许 Perl 代码出现在替换部分