bash - 用 awk 或 sed 替换和递增字母和数字

标签 bash perl nginx awk sed

我有一个字符串包含

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/

相关文章:

Bash -eq 不起作用,可能是因为 cal

bash - 如何在bash中捕获和修改正则表达式识别的数字

python - Django 和 Python + uWSGI

bash - Ping 结果到日志脚本 (El Capitan)

linux - Linux 程序的外部禁用信号

perl - 如何在蛋白质序列(字符串)中找到多个基序(子字符串)?

perl - Perl的价格是多少?变量用于什么?

perl - 在 Perl 中打开超过 10,000 个文件的问题

docker - docker组成nginx和tomcat,仅在互联网上公开nginx

tomcat - zookeeper 可以代替 Nginx 或 Apache Server 用作负载均衡器吗?