我有一个文件,其中包含从 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
请注意,它也会更改G0001
为G230
.如果您不想这样做,可以将其更改\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
生成的一个大命令序列,在一次调用中完成所有替换。我想将此命令拆分为多行以提高可读性,但不能 - 然后它停止工作。所以 - 单行:printf
paste
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
解释
sed -i -r "$(
paste -d'/'
- 通过斜杠连接左右部分(在 3,4 步中生成) -/
结果如下:s/G1\b/G230/g
<(printf 's/%s\\b\n' G{1..229})
- 生成替代命令的左侧部分sed
。例子:s/G1\b
,s/G2\b
,s/G3\b
, 很快。\b
- 匹配单词边界;也就是说,如果左边的字符是“单词”字符,右边的字符是“非单词”字符,则它匹配,反之亦然。信息-GNU sed,正则表达式扩展。
<(printf '%s/g\n' G{230..458})
- 生成替代命令的正确部分sed
。例子:G230/g
,G231/g
,G232/g
, 很快。)" 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;