如何用sed从文本文件随机取词批量替换多站点文件指定内容?
解决方案
场景1:每个文件内的所有"Dashemd"替换为同一个随机单词
用shuf命令直接从Hemd.txt随机取一行单词,结合find和sed批量处理所有目标文件,操作简洁可靠:
脚本实现
#!/bin/bash # 检查必要文件状态 if [ ! -f "Hemd.txt" ]; then echo "错误:Hemd.txt 文件不存在!" exit 1 fi if [ ! -s "Hemd.txt" ]; then echo "错误:Hemd.txt 文件为空!" exit 1 fi # 遍历www目录下所有index.html find ./www -name "index.html" -type f | while read -r file; do # 随机获取一个单词 random_word=$(shuf -n 1 Hemd.txt) # 替换目标单词,用#作为分隔符避免/等特殊字符冲突 sed -i "s#Dashemd#${random_word}#g" "$file" echo "已处理:$file" done
使用步骤
- 将代码保存为
replace_single_random.sh - 赋予执行权限:
chmod +x replace_single_random.sh - 在www目录的上级目录运行脚本:
./replace_single_random.sh
场景2:每个"Dashemd"实例替换为不同的随机单词
如果需要让文件中每一处"Dashemd"都替换成不同的随机词,用awk实现逐匹配项替换:
脚本实现
#!/bin/bash if [ ! -f "Hemd.txt" ]; then echo "错误:Hemd.txt 文件不存在!" exit 1 fi if [ ! -s "Hemd.txt" ]; then echo "错误:Hemd.txt 文件为空!" exit 1 fi # 把Hemd.txt的单词加载到数组 mapfile -t word_list < Hemd.txt total_words=${#word_list[@]} find ./www -name "index.html" -type f | while read -r file; do # awk逐行处理,替换每个匹配项为随机词 awk -v words="${word_list[*]}" -v total="$total_words" ' BEGIN { split(words, arr, " "); srand(); # 初始化随机数种子 } { while (match($0, /Dashemd/)) { rand_idx = int(rand() * total) + 1; $0 = substr($0, 1, RSTART-1) arr[rand_idx] substr($0, RSTART+RLENGTH); } print $0; }' "$file" > "$file.tmp" && mv "$file.tmp" "$file" echo "已处理:$file" done
补充说明
- 若系统没有
shuf命令(如部分老旧Linux发行版),可用以下代码替代随机取词逻辑:total_lines=$(wc -l < Hemd.txt) random_line=$((RANDOM % total_lines + 1)) random_word=$(sed -n "${random_line}p" Hemd.txt) - 如需忽略大小写匹配(同时替换
dashemd、Dashemd等),将sed命令的g改为gi,awk中的正则改为/Dashemd/i。
内容的提问来源于stack exchange,提问作者Daily World Live
相关产品推荐
相关产品推荐

