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

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

我有一个文件,其中包含从 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

答案1

这更像是一项工作(顺便说一句perl,GNU从中sed复制了它):-i

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

请注意,它也会更改G0001G230.如果您不想这样做,可以将其更改\d+[1-9]\d*

按照您的方法,即使您修复了引用,也会将文件重写 229 次,并且也无法按您希望的方式工作。

A s/\$G1/\$G230/g, 将更改为$G12$G2302然后下一个s/\$G2/\$G231/g会将其更改为G231302( 会s/\$G23/\$G252更改为,G2521302依此类推)。

答案2

bash 中的单引号停止变量扩展,因此以下内容正在寻找$G$num要替换为文字的文字$G$N

sed -i -e 's/$G$num/$G$N/g' file

您希望 bash 扩展发生,因此必须使用双引号并手动转义任何特殊字符:

sed -i -e "s/\$G$num/\$G$N/g" file

您可以通过以下脚本看到差异:

#!/bin/bash

for num in {1..229}; do
  N=$(($num+229))
  echo '$G$num $G$N' vs "\$G$num \$G$N"
done

生产

$G$num $G$N vs $G1 $G230
$G$num $G$N vs $G2 $G231
$G$num $G$N vs $G3 $G232
...
$G$num $G$N vs $G228 $G457
$G$num $G$N vs $G229 $G458

答案3

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

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

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

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

sed -i -r "s/G1\b/G230/g
s/G2\b/G231/g
s/G3\b/G232/g
s/G4\b/G233/g    
...
s/G227\b/G456/g
s/G228\b/G457/g
s/G229\b/G458/g" file.txt

解释

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

测试

输入

var G1 = value;
G3 = G1 + G2; 
G3 = G1 + G2
G3 = ${G1} + G2
var G2 = value;
var G3 = value;
G224 = G3 + G215;
G124 = G124 + G215;
G124 = G124 + G12;
var G4 = value;
var G5 = value;
var G6 = value;
var G59 = value;
var G60 = value;
var G156 = value;
var G227 = value;
var G228 = value;
var G229 = value;

输出

var G230 = value;
G232 = G230 + G231;
G232 = G230 + G231
G232 = ${G230} + G231
var G231 = value;
var G232 = value;
G453 = G232 + G444;
G353 = G353 + G444;
G353 = G353 + G241;
var G233 = value;
var G234 = value;
var G235 = value;
var G288 = value;
var G289 = value;
var G385 = value;
var G456 = value;
var G457 = value;
var G458 = value;

相关内容