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

Ubuntu WSL中使用fzf与EFF词表的Bash脚本出现异常字符串拼接问题

解决WSL 22.04中bash脚本输出错乱的问题

这个问题我碰到过!根源是Windows和Linux的换行符差异搞的鬼,具体来说是你的词表文件用了Windows的CRLF(\r\n)换行,而不是Linux的LF(\n)换行,在WSL环境里这个隐藏的回车符(\r)会直接搞乱终端输出逻辑。

当你用awk提取$2时,每个单词后面其实带了一个看不见的\r字符。当你echo这个变量时,\r会让终端光标直接跳回当前行的开头,后续输出的内容就会覆盖掉前面的内容——这就是你看到,elkal,elk-phrase: animal这类错乱输出的核心原因。

快速修复方案

有两种简单的解决方式,选一个就行:

1. 转换词表文件为Linux换行格式

直接把词表文件的换行符改成Linux标准的LF:

# 先安装dos2unix(如果没装的话)
sudo apt install dos2unix
# 转换文件
dos2unix eff_short_wordlist_2_0.txt

# 没有dos2unix的话用sed替代
sed -i 's/\r$//' eff_short_wordlist_2_0.txt

2. 在脚本中直接清理回车符

如果不想修改源文件,可以在提取单词时就去掉隐藏的\r
修改脚本里的单词提取逻辑,二选一即可:

# 方式A:awk处理时直接去掉回车符
word1=$(awk '{sub(/\r$/,"",$2); print $2}' eff_short_wordlist_2_0.txt | fzf)

# 方式B:用tr命令清理fzf的输出
word1=$(awk '{print $2}' eff_short_wordlist_2_0.txt | fzf | tr -d '\r')

把两个单词的提取逻辑都改成上面任意一种,脚本就能正常输出了。

为什么原生Ubuntu没问题?

因为原生Ubuntu环境下,下载的文件默认会用LF换行,或者系统会自动识别并处理CRLF格式的文件;而WSL如果挂载了Windows的文件系统(比如把词表存在/mnt/c下),或者下载时没有自动转换换行符,就会保留Windows的CRLF格式,从而触发这个问题。

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

火山引擎 最新活动