使用sed嵌套命令将game1替换为game001

使用sed嵌套命令将game1替换为game001,sed,Sed,要从以下位置替换1.txt: cat 1.txt | sed -E 's,game([0-9]+),game$(printf %03d \1),g' 致: 但结果是: game001 xxx vs yyy game011 aaa vs bbb 如何正确计算printf%03d\1?需要替换时,需要使用双引号 sed-E“s,game([0-9]+),game$(printf%03d\1),g“1.txt 编辑: 而且,我认为sed不能将\1的值传递给外部命令perl在这种情况下有帮助: $

要从以下位置替换
1.txt

cat 1.txt | sed -E 's,game([0-9]+),game$(printf %03d \1),g'
致:

但结果是:

game001 xxx vs yyy
game011 aaa vs bbb

如何正确计算
printf%03d\1

需要替换时,需要使用双引号

sed-E“s,game([0-9]+),game$(printf%03d\1),g“1.txt
编辑:

而且,我认为
sed
不能将
\1
的值传递给外部命令<代码>perl在这种情况下有帮助:

$cat 1.txt
游戏一xxx对yyy
游戏11 aaa对bbb
游戏21 aaa对bbb
$sed-E“s,game([0-9]+),game$(printf%03d\1),g“1.txt
游戏001 xxx对yyy
game001 aaa vs bbb
game001 aaa vs bbb
$#还可以使用:perl-pe的/game\K\d+/sprintf“%03d”,$&/ge'
$perl-pe's/game([0-9]+)/sprintf“game%03d”,$1/ge'1.txt
游戏001 xxx对yyy
游戏011 aaa vs bbb
game021 aaa vs bbb

您不能像这样组合shell命令和sed反向引用(如果可以,您必须双引号引用sed命令,请参阅其他答案)。shell将在sed看到命令之前尝试对其求值,但是
\1
对shell来说没有任何意义

不过,您可以按如下方式执行:

$ echo "game1 xxx vs yyy" | sed -E 's,game([0-9]+),game$(printf %03d \1),g'
game$(printf %03d 1) xxx vs yyy
第一个替换,
s/^(game)([[:digit:]+)/\100\2/
,在
game
之后的数字前面加两个零:

$ sed -E 's/^(game)([[:digit:]]+)/\100\2/;s/^(game).{0,2}([[:digit:]]{3})/\1\2/' 1.txt
game001 xxx vs yyy
game011 aaa vs bbb
第二个替换,
s/^(game)。{0,2}([[:digit:]{3})/\1\2/
删除
game
和其后三个数字之间的最多两个字符,以去除多余的零

注意

  • 我使用了
    /
    而不是
    作为分隔符,只是因为我更习惯于它
  • 我用
    ^
    游戏锚定在行的开头
  • 我为
    游戏
    又使用了一个捕获组,因此我不必在每个命令中键入两次
  • 我使用了POSIX字符类
    [[:digit:]
    ,而不是
    [0-9]
  • 我使用了
    sed''1.txt
    而不是
    cat1.txt | sed'
    来避免这种情况
只需使用awk:

$ sed -E 's/game([[:digit:]]+)/game00\1/' 1.txt
game001 xxx vs yyy
game0011 aaa vs bbb
或者通常使用GNU awk对保存的捕获组进行操作,以匹配第三个参数()

使用sed,您需要:

$ awk 'match($0,/(game)([0-9]+)(.*)/,a){ printf "%s%03d%s\n", a[1], a[2], a[3] }' file
game001 xxx vs yyy
game011 aaa vs bbb

感谢sed的解决方案!
$ awk '{sub(/game/,""); $1=sprintf("game%03d",$1)} 1' file
game001 xxx vs yyy
game011 aaa vs bbb
$ awk 'match($0,/(game)([0-9]+)(.*)/,a){ printf "%s%03d%s\n", a[1], a[2], a[3] }' file
game001 xxx vs yyy
game011 aaa vs bbb
$ sed -E 's/(game)([0-9]) /\10\2 /; s/(game)([0-9]{2}) /\10\2 /' file
game001 xxx vs yyy
game011 aaa vs bbb