使用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'
$ 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