如何通过Bash脚本结合Sed将扑克手牌文件中的用户名替换为递增编号的PLAYER
如何通过Bash脚本结合Sed将扑克手牌文件中的用户名替换为递增编号的PLAYER
看起来你已经有了初步思路,但目前的脚本只能单个替换用户名,没法实现自动递增的Player编号。我来帮你完善这个脚本,让它能批量识别所有唯一用户名,并按顺序替换成Player1、Player2……这样的格式。
核心思路
我们需要分两步走:
- 从手牌文件中提取所有唯一的用户名(也就是那些出现在
Seat X: 用户名行里的名称) - 给每个用户名分配一个递增的编号,然后用sed批量替换文件中所有出现该用户名的地方
完整的Bash脚本
#!/bin/bash # 定义输入输出文件路径 POKER_HAND="/vagrant/sample.txt" OUTPUT_FILE="/vagrant/poker-output.txt" # 第一步:提取所有唯一的用户名(仅从Seat开头的行中获取) # awk提取Seat行的第三个字段,sort -u去重 USERS=$(awk '/^Seat [0-9]+:/ {print $3}' "$POKER_HAND" | sort -u) # 第二步:构建sed替换脚本,给每个用户分配递增的Player编号 COUNT=1 SED_COMMANDS="" for USER in $USERS; do # 用\Q和\E包裹用户名,避免用户名中的特殊字符(比如点、下划线)干扰sed正则 SED_COMMANDS+="s/\Q$USER\E/Player$COUNT/g;" ((COUNT++)) done # 第三步:执行替换并输出结果到目标文件 sed -r "$SED_COMMANDS" "$POKER_HAND" > "$OUTPUT_FILE" echo "替换完成!结果已保存到 $OUTPUT_FILE"
脚本细节解释
- 文件路径定义:先定义
POKER_HAND和OUTPUT_FILE,避免像你之前那样变量顺序错误导致的空值问题 - 提取用户名:用
awk定位所有以Seat 数字:开头的行,提取第三个字段(也就是用户名),再用sort -u保证每个用户名只出现一次 - 构建sed命令:循环每个唯一用户名,生成对应的替换规则,
\Q和\E是sed的转义标记,能自动处理用户名中的正则特殊字符(比如C.Luz7里的点) - 执行替换:把所有替换规则一次性传给sed,高效完成全局替换
原脚本的问题修正
你之前的脚本存在两个关键问题:
- 变量顺序错误:
NAME定义在POKER_HAND之前,导致grep无法找到文件,变量为空 - 只能单个替换:每次只能处理一个用户名,无法批量识别所有用户并递增编号
用上面的脚本运行你提供的sample.txt,就能得到你期望的输出结果啦。
备注:内容来源于stack exchange,提问作者Mugiwara
相关产品推荐
相关产品推荐

