我有一个字符串包含
fastcgi_cache_path /var/run/nginx-cache15 levels=1:2 keys_zone=MYSITEP:100m inactive=60m;
此脚本的目标之一是根据在上一个文件中找到的值将 nginx-cache 增加两位数。为此,我使用了这段代码:
# Replace cache_path
PREV=$(ls -t /etc/nginx/sites-available | head -n1) #find the previous cache_path number
CACHE=$(grep fastcgi_cache_path $PREV | awk '{print $2}' |cut -d/ -f4) #take the string to change
SUB=$(echo $CACHE |sed "s/nginx-cache[0-9]*[0-9]/&@/g;:a {s/0@/1/g;s/1@/2/g;s/2@/3/g;s/3@/4/g;s/4@/5/g;s/5@/6/g;s/6@/7/g;s/7@/8/g;s/8@/9/g;s/9@/@0/g;t a};s/@/1/g") #increment number
sed -i "s/nginx-cache[0-9]*/$SUB/g" $SITENAME #replace number
也许不是那么优雅,但它确实有效。
另一个目标是递增所有 MYSITEx 出现的最后一个字母(MYSITEP,在这种情况下,应该变成 MYSITEQ,在 MYSITEP 等之后,一旦到达 MYSITEZ 添加另一个字母,例如 MYSITEAA, MYSITEAB等等等
我想是这样的:
sed -i "s/MYSITEP[A-Z]*/MYSITEGG/g" $SITENAME
但它无法工作,因为 MYSITEGG 是一个静态值,无法使用。 如何计算最后一个字母,将其递增到下一个字母,并在到达最后一个 Z 字母后,添加另一个字母?
谢谢!
最佳答案
Perl 的自动增量将以您描述的方式对字母和数字起作用
我们也可以整理您的 nginx-cache
增量
我假设 SITENAME
包含要修改的文件的名称?
它看起来像这样。我必须将捕获 $1
分配给一个普通变量 $n
以增加它,因为 $1
是只读的
perl -i -pe 's/nginx-cache\K(\d+)/ ++($n = $1) /e; s/MYSITE\K(\w+)/ ++($n = $1) /e;' $SITENAME
如果你愿意,这可以在一个单一的替换中完成,就像这样
perl -i -pe 's/(?:nginx-cache|MYSITE)\K(\w+)/ ++($n = $1) /ge' $SITENAME
关于bash - 用 awk 或 sed 替换和递增字母和数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42520141/