为什么sed只替换第一个字符?

为什么sed只替换第一个字符?,sed,bash,Sed,Bash,long命令用于将a..z替换为1..26。请注意,回显字符串中有3个“l”字符。为什么第一个正确地转换为“12”,而另外两个(结果11l13和202l223)则没有 我在运行Cygwin(bash 4.3.33(1)-发行版(x86_64-unknown-Cygwin))的Windows 7 PC和运行MacBook Pro的终端(bash 3.2)上都进行了尝试,得到了相同的结果。我希望结果是1..26串联。这是我简化为这个测试用例的一个更大问题的一部分。您需要g标志来重复替换: $ ech

long命令用于将a..z替换为1..26。请注意,回显字符串中有3个“l”字符。为什么第一个正确地转换为“12”,而另外两个(结果11l13和202l223)则没有


我在运行Cygwin(bash 4.3.33(1)-发行版(x86_64-unknown-Cygwin))的Windows 7 PC和运行MacBook Pro的终端(bash 3.2)上都进行了尝试,得到了相同的结果。我希望结果是1..26串联。这是我简化为这个测试用例的一个更大问题的一部分。

您需要
g
标志来重复替换:

$ echo lcdefghijklmnopqrstblvcxyz | tr [a-i] [1-9] | sed 's/j/10/' | sed 's/k/11/' | sed 's/l/12/' | sed 's/m/13/' | sed 's/n/14/' | sed 's/o/15/' | sed 's/p/16/' | sed 's/q/17/' | sed 's/r/18/' | sed 's/s/19/' | sed 's/t/20/' | sed 's/u/21/' | sed 's/v/22/' | sed 's/w/23/' | sed 's/x/24/' | sed 's/y/25/' | sed 's/z/26/'
1234567891011l13141516171819202l223242526
如果没有
g
标志,
s
将替换第一个实例,如
man-sed
中所述

此外,您还可以将所有这些命令放在一次sed调用中。您不需要所有这些管道:

$ echo lll | sed 's/l/12/'
12ll
$ echo lll | sed 's/l/12/'g
121212

您需要
g
标志才能重复替换:

$ echo lcdefghijklmnopqrstblvcxyz | tr [a-i] [1-9] | sed 's/j/10/' | sed 's/k/11/' | sed 's/l/12/' | sed 's/m/13/' | sed 's/n/14/' | sed 's/o/15/' | sed 's/p/16/' | sed 's/q/17/' | sed 's/r/18/' | sed 's/s/19/' | sed 's/t/20/' | sed 's/u/21/' | sed 's/v/22/' | sed 's/w/23/' | sed 's/x/24/' | sed 's/y/25/' | sed 's/z/26/'
1234567891011l13141516171819202l223242526
如果没有
g
标志,
s
将替换第一个实例,如
man-sed
中所述

此外,您还可以将所有这些命令放在一次sed调用中。您不需要所有这些管道:

$ echo lll | sed 's/l/12/'
12ll
$ echo lll | sed 's/l/12/'g
121212
多个sed命令(带
g
开关) 在下面,您可以尝试以下操作:

sed 's/j/10/g;s/k/11/g;s/l/12/g...'
c=1 o=
对于{a..z}中的i;做
o++=“s/$i/$((c++)/g;”
完成
sed-e“$o”多个sed命令(带
g
开关) 在下面,您可以尝试以下操作:

sed 's/j/10/g;s/k/11/g;s/l/12/g...'
c=1 o=
对于{a..z}中的i;做
o++=“s/$i/$((c++)/g;”
完成
sed-e“$o”这可能适合您(GNU-sed):

这将使用a来翻译所需的字符串。

这可能适用于您(GNU-sed):


这将使用转换所需字符串。

您不需要为每个替换运行单独的
sed
命令
sed-e's/j/10/'-e's/k/11/'-e's/l/12/'
sed
有一个
y
命令,类似于
tr
。您可能应该将
a..i
替换为
01..09
。否则,当结果中有
123
时,您不知道它是来自
abc
aw
还是
lc
。感谢您的帮助,Barmar。您不需要为每个替换运行单独的
sed
命令
sed-e's/j/10/'-e's/k/11/'-e's/l/12/'
sed
有一个
y
命令,类似于
tr
。您可能应该将
a..i
替换为
01..09
。否则,当您在结果中有
123
时,您不知道它是否来自
abc
aw
lc
。感谢您的帮助Barmar。非常感谢-缺少sed做1替换,缺少g标志来更改,这是我的问题。非常感谢-缺少sed做1替换,缺少g标志来更改它,这是我的问题。很好…………总是喜欢你的sed答案……甚至在我现在开始学习的时候,我还极端地记住了一个答案sed@repzero谢谢,但我很好…………总是喜欢你的sed答案……甚至在我现在开始学习的时候,我都极端地记住了一个答案sed@repzero谢谢,但我只是
sed -r '1{x;s/^/a1b2c3d4e5f6g7h8i9j10k11l12m13n14o15p16q17r18s19t20u21v22w23x24y25z26/;x};G;:a;s/([a-z])(.*\n.*\1([0-9]+))/\3\2/;ta;P;d' file