如何用部分字符串搜索保存完整字符串为变量,实现配置替换与数字验证
解决方案
1. 提取目标字符串到变量var1
假设你的配置文件名为config.txt,以day变量为例,通过grep匹配目标行后,用sed剥离多余的引号和set前缀,得到你需要的current_day=24格式字符串:
# 以day变量为例,提取目标字符串到var1 var1=$(grep "$day" config.txt | sed -E 's/^"set (.*)"$/\1/') # 验证结果 echo "$var1" # 输出:current_day=24
2. 处理用户输入:验证并移除前导零
先提示用户输入新数字,再通过两种方式处理前导零,同时验证输入有效性:
方式1:用sed移除前导零(兼容所有环境)
read -p "请输入新的日期数字:" new_num # 移除前导零:0024 → 24,0 → 空(若需保留0可调整正则为s/^0+([0-9])/\1/) new_num=$(echo "$new_num" | sed -E 's/^0+([0-9]+)$/\1/; s/^0$//') # 验证输入是否为纯数字 if ! [[ "$new_num" =~ ^[0-9]+$ ]]; then echo "错误:请输入有效的正整数!" exit 1 fi # 生成新的键值对 new_var="${day}${new_num}" echo "$new_var" # 输出:current_day=10(假设输入10)
方式2:用Bash算术扩展(更高效,无需外部命令)
read -p "请输入新的日期数字:" new_num # 用10进制强制转换移除前导零,0024 → 24,0 → 0 if ! [[ "$new_num" =~ ^[0-9]+$ ]]; then echo "错误:请输入有效的正整数!" exit 1 fi new_num=$((10#$new_num)) # 生成新的键值对 new_var="${day}${new_num}"
3. 替换文件中的原内容
用sed批量替换文件中的旧字符串为新字符串:
# Linux环境下的sed sed -i "s/$var1/$new_var/" config.txt # macOS环境下的sed(需要加空参数) sed -i "" "s/$var1/$new_var/" config.txt
批量处理三个变量的示例
如果要同时处理day、month、year三个变量,可以封装成循环:
#!/bin/bash file="config.txt" vars=("day" "month" "year") for var_name in "${vars[@]}"; do # 获取变量值(比如day对应current_day=) key="${!var_name}" # 提取原字符串 old_str=$(grep "$key" "$file" | sed -E 's/^"set (.*)"$/\1/') # 提示输入 read -p "请输入新的${var_name}数字:" new_num # 处理前导零并验证 if ! [[ "$new_num" =~ ^[0-9]+$ ]]; then echo "错误:请输入有效的正整数!" exit 1 fi new_num=$((10#$new_num)) # 生成新字符串 new_str="${key}${new_num}" # 替换文件 sed -i "s/$old_str/$new_str/" "$file" done
内容的提问来源于stack exchange,提问作者Rubberducky
相关产品推荐
相关产品推荐

