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)
这更像是一份工作perl
(顺便说一下,GNUsed
复制了它-i
):
perl -pi -e 's{\$G\K\d+}{
if ($& >= 1 && $& <= 229) {
$& + 229
} else {
$&
}}ge' file
Run Code Online (Sandbox Code Playgroud)
请注意,它也会更改G0001
为G230
。如果您不希望那样,可以将 更改\d+
为[1-9]\d*
。
使用您的方法,即使您修复了引用,也会重写文件 229 次,并且也无法按您的意愿工作。
A s/\$G1/\$G230/g
, 将更$G12
改为$G2302
,然后下一个s/\$G2/\$G231/g
将更改为G231302
(s/\$G23/\$G252
将更改为G2521302
等等)。
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\n
Run Code Online (Sandbox Code Playgroud)\n它正在转换为以下sed
命令:
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解释
\nsed -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
、等等。\n\\b
- 匹配单词边界;也就是说,如果左侧的字符是 \xe2\x80\x9cword\xe2\x80\x9d 字符并且右侧的字符是 \xe2\x80\x9cnon-word\xe2\x80\x9d 字符,则它匹配,或者反之亦然。信息- GNU sed,正则表达式扩展。<(printf \'%s/g\\n\' G{230..458})
- 生成sed
替代命令的正确部分。例如: G230/g
、G231/g
、G232/g
、 等。)" file.txt
- 输入文件。输入
\nvar 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输出
\nvar 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