Bash脚本中修改指定CSV格式角色对应数值为0的实现方案问询
实现Bash脚本修改role_portions指定角色数值为0
好的,咱们来搞定这个脚本需求。这里有两种实用的实现思路,你可以根据自己的场景选择:
方法一:用awk一次性处理(高效简洁)
awk非常适合处理这种键值对的替换场景,只需要遍历一次数据就能完成所有修改,效率很高。
完整脚本代码:
#!/bin/bash # 检查用户是否传入了角色列表参数 if [ $# -eq 0 ]; then echo "请传入需要修改的角色列表,格式为CSV,例如:role_2,role_4,role_7" exit 1 fi # 从properties文件中读取role_portions的原始值(假设文件名为config.properties) role_portions=$(grep "^role_portions=" config.properties | cut -d'=' -f2) # 将输入的CSV角色列表传给awk target_roles="$1" # 用awk完成替换逻辑 echo "$role_portions" | awk -v roles="$target_roles" ' BEGIN { # 把目标角色分割成数组,标记需要修改的角色 split(roles, target_arr, ",") for (i in target_arr) { target_roles_map[target_arr[i]] = 1 } # 分割原始的role_portions为单个键值对 split($0, role_pairs, ",") } { output = "" # 遍历每个键值对 for (j in role_pairs) { split(role_pairs[j], kv, ":") current_role = kv[1] current_value = kv[2] # 如果是目标角色,把值改成0 if (current_role in target_roles_map) { current_value = 0 } # 拼接结果字符串 if (output != "") { output = output "," } output = output current_role ":" current_value } print output }'
代码解释:
- 参数检查:先判断用户是否传入了角色列表,没传就提示并退出。
- 读取原始值:用
grep精准匹配行首的role_portions=,再用cut分割出等号后面的内容。 - awk处理逻辑:
- 把输入的CSV角色列表分割成数组,用一个map标记需要修改的角色。
- 把原始的role_portions分割成单个
role:value对,逐个检查是否在目标列表里,是就把值改成0。 - 最后把所有修改后的键值对拼接成字符串输出。
方法二:用sed循环替换(直观易懂)
如果觉得awk的语法有点复杂,也可以用sed结合循环的方式,逻辑更直观,适合新手理解。
完整脚本代码:
#!/bin/bash if [ $# -eq 0 ]; then echo "请传入需要修改的角色列表,格式为CSV,例如:role_2,role_4,role_7" exit 1 fi # 读取原始的role_portions值 role_portions=$(grep "^role_portions=" config.properties | cut -d'=' -f2) # 把输入的CSV角色列表分割成数组 IFS=',' read -ra target_roles <<< "$1" # 循环遍历每个角色,用sed替换对应的数值为0 for role in "${target_roles[@]}"; do # 如果角色名包含正则特殊字符(比如.、*),需要先转义 escaped_role=$(printf '%s' "$role" | sed 's/[.[\*^$]/\\&/g') role_portions=$(echo "$role_portions" | sed "s/$escaped_role:[0-9]\+/$escaped_role:0/g") done # 输出修改后的结果 echo "$role_portions"
代码解释:
- 分割角色列表:用
read -ra把CSV格式的输入分割成数组,方便循环处理。 - 循环替换:对每个角色,先转义可能含有的正则特殊字符,再用sed匹配
role:数字的格式,替换成role:0。 - 输出结果:循环完成后,输出修改后的role_portions字符串。
注意事项
- 确保你的properties文件中
role_portions的格式规范,没有多余的空格或特殊字符。 - 如果角色名包含正则特殊字符(比如
.、*),方法二中的转义步骤很重要,否则sed会匹配错误。 - 可以把properties文件名做成脚本的可选参数,让脚本更灵活,比如:
config_file="${2:-config.properties}",这样用户可以通过第二个参数指定文件。
内容的提问来源于stack exchange,提问作者Java Learner




