Bash 将增加的数字添加到文件中的字符串

Bash add increased number to string in a file

我有这个属性文件,其中可以包含尽可能多的“spark-worker”字符串:

[master]
spark-master ansible_ssh_host=ec2-3-236-23-XXX.compute-1.amazonaws.com

[worker]
spark-worker ansible_ssh_host=ec2-34-204-206-XXX.compute-1.amazonaws.com
spark-worker ansible_ssh_host=ec2-3-238-204-XXX.compute-1.amazonaws.com
.
.
spark-worker ansible_ssh_host=ec2-3-238-204-XXX.compute-1.amazonaws.com

[spark_cluster:children]
master
worker

我想在每个字符串“spark-worker”后添加一个数字,这样结果就是:

[master]
spark-master ansible_ssh_host=ec2-3-236-23-XXX.compute-1.amazonaws.com

[worker]
spark-worker-1 ansible_ssh_host=ec2-34-204-206-XXX.compute-1.amazonaws.com
spark-worker-2 ansible_ssh_host=ec2-3-238-204-XXX.compute-1.amazonaws.com
.
.
spark-worker-n ansible_ssh_host=ec2-3-238-204-XXX.compute-1.amazonaws.com

[spark_cluster:children]
master
worker

最好的 bash 方法是什么?

bash 脚本中使用 sed

#!/usr/bin/env bash

n=1 
while read -r line; do 
    sed -i.bak "s/spark-worker/&-$n/" <<< "$line"
    if [[ "$line" =~ "spark-worker" ]]; then 
        n=$(( n+1 )) 
    fi
done < input_file

或者作为一个班轮

$ n=1; while read -r line; do sed "s/spark-worker/&-$n/" <<< "$line"; if [[ "$line" =~ "spark-worker" ]]; then n=$(( n+1 )); fi; done < input_file
[master]
spark-master ansible_ssh_host=ec2-3-236-23-XXX.compute-1.amazonaws.com

[worker]
spark-worker-1 ansible_ssh_host=ec2-34-204-206-XXX.compute-1.amazonaws.com
spark-worker-2 ansible_ssh_host=ec2-3-238-204-XXX.compute-1.amazonaws.com
.
.
spark-worker-3 ansible_ssh_host=ec2-3-238-204-XXX.compute-1.amazonaws.com

[spark_cluster:children]
master
worker

或使用awk

awk -v work="spark-worker" '[=12=]~work{n++; gsub(work,work"-"n)}1' input_file
[master]
spark-master ansible_ssh_host=ec2-3-236-23-XXX.compute-1.amazonaws.com

[worker]
spark-worker-1 ansible_ssh_host=ec2-34-204-206-XXX.compute-1.amazonaws.com
spark-worker-2 ansible_ssh_host=ec2-3-238-204-XXX.compute-1.amazonaws.com
.
.
spark-worker-3 ansible_ssh_host=ec2-3-238-204-XXX.compute-1.amazonaws.com

[spark_cluster:children]
master
worker

一个awk一行:

awk ' == "spark-worker" {  =  "-" ++c } 1' file

这可能对你有用 (GNU sed):

sed -E 's/spark-worker/&-\n/g;T
        :a;x;s/.*/echo $((&+1))/e;x;G;s/\n(.*)\n(.*)//;/\n/ba' file

通过设置 -E 命令行选项打开扩展正则表达式。

将所有出现的字符串 spark-worker 替换为 - 和换行符。

如果没有发生替换,则不对当前行执行进一步处理。

否则,通过计算 bash shell 回显命令,在 hold space 中增加一个计数器,将计数器附加到当前行,然后附加该计数器到所需字符串的第一次出现,如果出现更多,重复直到没有更多。