You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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
}'

代码解释:

  1. 参数检查:先判断用户是否传入了角色列表,没传就提示并退出。
  2. 读取原始值:用grep精准匹配行首的role_portions=,再用cut分割出等号后面的内容。
  3. 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"

代码解释:

  1. 分割角色列表:用read -ra把CSV格式的输入分割成数组,方便循环处理。
  2. 循环替换:对每个角色,先转义可能含有的正则特殊字符,再用sed匹配role:数字的格式,替换成role:0
  3. 输出结果:循环完成后,输出修改后的role_portions字符串。

注意事项

  • 确保你的properties文件中role_portions的格式规范,没有多余的空格或特殊字符。
  • 如果角色名包含正则特殊字符(比如.*),方法二中的转义步骤很重要,否则sed会匹配错误。
  • 可以把properties文件名做成脚本的可选参数,让脚本更灵活,比如:config_file="${2:-config.properties}",这样用户可以通过第二个参数指定文件。

内容的提问来源于stack exchange,提问作者Java Learner

火山引擎 最新活动