如何用UNIX/Linux命令行提取C#项目所有单词以修正拼写错误
批量提取C#解决方案单词并修正拼写错误
单个文件的单词提取
你之前用grep -wo ".*"无效是因为.*会匹配整行内容,要提取单个单词,用grep的扩展正则匹配字母数字(适配C#代码里的标识符):
grep -Eo "\w+" blabla.cs
这个命令会把文件里所有由字母、数字、下划线组成的单词逐行输出。如果要包含连字符这类特殊单词,可调整正则为grep -Eo "[a-zA-Z0-9_-]+"。
也可以用tr配合sed处理非字母字符:
tr -cs "[:alpha:]" "\n" < blabla.cs | sed '/^$/d'
tr -cs "[:alpha:]" "\n"把非字母字符替换为换行,sed '/^$/d'过滤掉空行。
解决find命令的管道问题
你直接写find ./ -name "*.cs" -exec cat {} | tr...会出错,因为-exec无法直接处理管道,shell会把管道后面的内容当成未完成命令,所以返回>提示符等待输入。正确做法是用sh -c包裹管道命令:
find ./ -name "*.cs" -exec sh -c 'cat "$1" | tr -cs "\w" "\n"' _ {} \; >> /mnt/c/Temp_Folder/output.txt
sh -c启动子shell执行后续命令字符串$1对应传入的文件名(即{})_是占位符,对应子shell的$0参数,不影响实际功能
更高效的写法是把所有文件内容通过管道一次性处理,避免多次打开输出文件:
find ./ -name "*.cs" -exec cat {} \; | tr -cs "\w" "\n" >> /mnt/c/Temp_Folder/output.txt
生成去重的单词列表
提取完所有单词后,用sort和uniq去重:
sort /mnt/c/Temp_Folder/output.txt | uniq > unique_words.txt
后续拼写检查与批量替换
拿到unique_words.txt后,用拼写检查工具扫描找出错误词汇。之后可用sed批量替换整个解决方案里的错误单词,比如把错误词wroong替换为wrong:
find ./ -name "*.cs" -exec sed -i 's/wroong/wrong/g' {} \;
注意:替换前先在少量文件测试,避免误改代码中的字符串、注释或标识符。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

