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 中增加一个计数器,将计数器附加到当前行,然后附加该计数器到所需字符串的第一次出现,如果出现更多,重复直到没有更多。
我有这个属性文件,其中可以包含尽可能多的“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 中增加一个计数器,将计数器附加到当前行,然后附加该计数器到所需字符串的第一次出现,如果出现更多,重复直到没有更多。