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

alr*_*lrz 9 sed text-processing

我有一个文本文件如下:

test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
Run Code Online (Sandbox Code Playgroud)

如何用分号替换逗号, 从第二个开始(并继续到最后一个)?

我想得到如下输出:

test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
Run Code Online (Sandbox Code Playgroud)

Rah*_*hul 14

这可以做到这一点,

$ sed -e 's/,/;/g' -e 's/;/,/1' infile
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
Run Code Online (Sandbox Code Playgroud)

解释

  • s/,/;/g替换所有出现的,with;

  • s/;/,/1替换第一次出现的;with,


如果你有 GNU sed,你也可以试试这个简单方便的,

sed 's/,/;/2g' infile
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢这个解决方案的一点是,当您用包含分号的字符串替换“test1”时,它会意外崩溃。 (7认同)
  • 不知道 GNU sed 上的 `sed 's/,/;/2g'`,很酷! (4认同)

Joh*_*024 7

如果输入中可能已经有分号,我们必须小心:

$ sed 's/,/\n/g; s/\n/,/; s/\n/;/g' input
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
Run Code Online (Sandbox Code Playgroud)

由于 sed 是逐行读取输入的,因此正常输入中不会有换行符。所以,我们可以用换行符替换所有的逗号,我们知道不会有任何混淆。接下来我们将第一个换行符恢复为逗号。最后,我们用分号替换所有剩余的换行符。

更详细地:

  • s/,/\n/g 用换行符替换所有逗号。

  • s/\n/,/ 用逗号替换第一个换行符。

  • s/\n/;/g 用分号替换所有剩余的换行符。