如何用该值+常量替换一个值

Sad*_*tan 6 sed text-processing numeric-data

我有一个文件,其中包含从 G1 到 G229 的变量。我想用G230到G469替换它们;我怎么能做到这一点?我试过这个 bash 脚本,但没有用:

#!/bin/bash

for num in {1..229}
  do
  echo G$num
  N=$(($num+229))
  echo G$N  
  sed -i -e 's/$G$num/$G$N/g' file
done
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 8

这更像是一份工作perl(顺便说一下,GNUsed复制了它-i):

perl -pi -e 's{\$G\K\d+}{
  if ($& >= 1 && $& <= 229) {
    $& + 229
  } else {
    $&
  }}ge' file
Run Code Online (Sandbox Code Playgroud)

请注意,它也会更改G0001G230。如果您不希望那样,可以将 更改\d+[1-9]\d*

使用您的方法,即使您修复了引用,也会重写文件 229 次,并且也无法按您的意愿工作。

A s/\$G1/\$G230/g, 将更$G12改为$G2302,然后下一个s/\$G2/\$G231/g将更改为G231302s/\$G23/\$G252将更改为G2521302等等)。


Min*_*Max 2

sed解决方案。也许这太棘手并且不太理想,但它确实有效。作为一个实验:)。

\n

它通过执行由和使用sed生成的一个大命令序列,在一次调用中完成所有替换。我想将此命令拆分为多行以提高可读性,但不能 - 然后它停止工作。所以 - 单行:printfpaste

\n
sed -i -r "$(paste -d\'/\' <(printf \'s/%s\\\\b\\n\' G{1..229}) <(printf \'%s/g\\n\' G{230..458}))" file.txt\n
Run Code Online (Sandbox Code Playgroud)\n

它正在转换为以下sed命令:

\n
sed -i -r "s/G1\\b/G230/g\ns/G2\\b/G231/g\ns/G3\\b/G232/g\ns/G4\\b/G233/g    \n...\ns/G227\\b/G456/g\ns/G228\\b/G457/g\ns/G229\\b/G458/g" file.txt\n
Run Code Online (Sandbox Code Playgroud)\n

解释

\n
    \n
  1. sed -i -r "$(
  2. \n
  3. paste -d\'/\'- 通过斜杠连接左右部分(在 3,4 步中生成) -/结果如下:s/G1\\b/G230/g
  4. \n
  5. <(printf \'s/%s\\\\b\\n\' G{1..229})- 生成sed替代命令的左侧部分。示例: s/G1\\bs/G2\\bs/G3\\b、等等。\n
      \n
    • \\b- 匹配单词边界;也就是说,如果左侧的字符是 \xe2\x80\x9cword\xe2\x80\x9d 字符并且右侧的字符是 \xe2\x80\x9cnon-word\xe2\x80\x9d 字符,则它匹配,或者反之亦然。信息- GNU sed,正则表达式扩展。
    • \n
    \n
  6. \n
  7. <(printf \'%s/g\\n\' G{230..458})- 生成sed替代命令的正确部分。例如: G230/gG231/gG232/g、 等。
  8. \n
  9. )" file.txt- 输入文件。
  10. \n
\n
\n

测试

\n

输入

\n
var G1 = value;\nG3 = G1 + G2; \nG3 = G1 + G2\nG3 = ${G1} + G2\nvar G2 = value;\nvar G3 = value;\nG224 = G3 + G215;\nG124 = G124 + G215;\nG124 = G124 + G12;\nvar G4 = value;\nvar G5 = value;\nvar G6 = value;\nvar G59 = value;\nvar G60 = value;\nvar G156 = value;\nvar G227 = value;\nvar G228 = value;\nvar G229 = value;\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
var G230 = value;\nG232 = G230 + G231;\nG232 = G230 + G231\nG232 = ${G230} + G231\nvar G231 = value;\nvar G232 = value;\nG453 = G232 + G444;\nG353 = G353 + G444;\nG353 = G353 + G241;\nvar G233 = value;\nvar G234 = value;\nvar G235 = value;\nvar G288 = value;\nvar G289 = value;\nvar G385 = value;\nvar G456 = value;\nvar G457 = value;\nvar G458 = value;\n
Run Code Online (Sandbox Code Playgroud)\n