替换除第一个字符之外的所有字符

替换除第一个字符之外的所有字符

我有一个文本文件如下:

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 代码出现在替换部分

相关内容