提问人:Dominique 提问时间:9/18/2023 最后编辑:Dominique 更新时间:9/19/2023 访问量:133
如何在一堆文件中创建所有单词的列表?
How to create a list of all words in a bunch of files?
问:
我正在与一位同事打交道,他在整个 C# 解决方案中犯了大量复制/粘贴的拼写错误。
我不想在每个单独的文件上使用拼写检查器,而是想创建整个解决方案中所有单词的列表,在该列表中启动拼写检查器,然后对找到的条目进行完整的“查找和替换”。
为了在文件中找到所有单词,我想到做这样的事情:
grep -wo ".*" blabla.txt
但这似乎行不通:它不是显示每个找到的单词,而是仍然显示找到单词的整行,例如:
this is OK
this is NOK
OK it is
NOK it is
Everything is OK
当我期待这样的事情时:
this
is
OK
this
is
NOK
...
一旦我得到了一个文件的列表,我就可以开始处理并做一些事情来获得单个单词。find ./ -name "*.cs" -exec grep ... {} \; >>output_list
sort output_list | uniq
但首先要做的事情是:由于没有向我显示单词,而是显示整行,因此我可以做些什么来使用 UNIX/Linux 命令行显示文件中的所有单词?(我添加了标签,因为这可能是一个解决方案?但我肯定不是巫师:-))grep -ow ".*"
awk
awk
在第一个答案后编辑:
确实似乎是要走的路。我可能只是使用 ,但有一个问题:我尝试了以下方法,但没有奏效:tr
tr ' ' '\n'
find ./ -name "*.cs" -exec cat {} | tr ' ' '\n' >>/mnt/c/Temp_Folder\output.txt \;
该命令给了我一个答案(因为我在某个代码编辑器中),我还做错了什么?>
答:
您可以使用命令:grep
grep -o -E '\S+' blabla.txt | tr ' ' '\n'
现在,您将获得所需的输出:
this
is
OK
this
is
NOK
...
评论
如何使用将每个空格/制表符替换为换行符:tr
tr '[[:blank:]]' '\n' <file
this
is
OK
this
is
NOK
OK
it
is
NOK
it
is
Everything
is
OK
根据您编辑的问题,您可以在 shell 中使用此解决方案:find + tr
bash
while IFS= read -rd '' f; do
tr ' ' '\n' < "$f"
done < <(find . -name '*.cs' -print0) >/mnt/c/Temp_Folder/output.txt
评论
使用 GNU AWK
find ./ -name "*.cs" -print0 |
xargs -0 awk -v IGNORECASE=1 '
{ for(i=1; i<=NF; i++) a[$i] }
END {
n=asorti(a,b)
for(i=1; i<=n; i++) print b[i]
print ""
}
'
如果要在文件中包含所有唯一的单词,请使用以下命令:cat input.txt | tr -s ' ' '\n' | sort | uniq
使用 instead 来仅标识单词组成字符而不是任何字符,并使用 instead 来仅查找包含 2 个或更多此类字符的字符串,这样您的输出就不会被单个字符(如 、 等)弄得杂乱无章:\w
.
{2,}
*
a
i
$ grep -Eow '\w{2,}' file
this
is
OK
this
is
NOK
OK
it
is
NOK
it
is
Everything
is
OK
我建议你也不要试图查找/修改 2 个字母的“单词”,因为它们不太可能是错误的,而且无论如何都很容易理解,并坚持使用 3 个或更多字母的单词:
$ grep -Eow '\w{3,}' file
this
this
NOK
NOK
Everything
当你去替换它们时,创建一个名为这样的文件,将坏词映射到好词:bad2good
tish this
thsi this
ONK NOK
然后使用这个 GNU awk(for 和 word boundaries)脚本:\<
\>
awk '
NR==FNR {
b2g["\\<" $1 "\\>"] = $2
next
}
{
for ( bad in b2g ) {
good = b2g[bad]
gsub(bad,good)
}
}
' bad2good file
保留备份并小心!特别是,请确保在更改后对文件进行人工审查并编译它们,因为这是您正在进行的危险练习。
我将利用 GNU 来完成这项任务,让内容AWK
file.txt
Able Baker Charlie
Dog Charlie Charlie
然后
awk 'BEGIN{RS="[^[:alpha:]]+"}!arr[$0]++' file.txt
给出输出
Able
Baker
Charlie
Dog
解释:我告诉 GNU 行分隔符 () 是一个或多个非字母字符,然后我使用数组和后递增,所以第一次看到时它是 0,否则是更大的数字,我否定它只打印给定行的第一次出现(在这种情况下是单词)。AWK
RS
arr
(在 GNU Awk 5.1.0 中测试)
评论