Bash脚本循环中Sed替换功能失效问题求助
解决Bash循环里用sed替换文本的问题
原脚本的问题
- 没必要用
temp.txt临时文件,写文件再用cut读取完全是冗余操作,直接拆分每行内容即可。 - 循环多次调用
sed -i修改同一个文件,不仅效率低,若用户名包含/、.这类sed特殊元字符,会直接导致替换逻辑失效。
改进方案1:简化循环逻辑(去掉临时文件)
直接通过read命令拆分每行的用户ID和用户名,避免多余的文件操作:
input="adminuser.txt" while read -r user_id user_name; do # 加\<\>是为了匹配完整用户名,防止类似yimenju1这类字符串被误替换 sed -i "s/\<$user_name\>/$user_id/g" result.txt done < "$input"
更高效的方案2:用awk一次性处理(推荐)
awk可以直接关联两个文件的内容,无需循环调用sed,效率更高且更安全:
awk ' # 先处理adminuser.txt,把用户名和对应ID存成键值对 NR==FNR { id_map[$2] = $1; next } # 再处理result.txt,将第一个字段替换为对应的用户ID { if ($1 in id_map) $1 = id_map[$1]; print } ' adminuser.txt result.txt > temp_result && mv temp_result result.txt
注:先写入临时文件再替换原文件,是为了避免处理过程中出现异常导致原文件损坏。
最终效果
执行后result.txt内容会变为预期的样子:
48 1 48 2 50 3
内容的提问来源于stack exchange,提问作者jalaluddin
相关产品推荐
相关产品推荐

