Linux shell脚本:如何删除单词列表文件中的初始数字?
我有一个示例列表文本文件(每行一个单词): 我想获得:Linux shell脚本:如何删除单词列表文件中的初始数字?,linux,shell,numbers,Linux,Shell,Numbers,我有一个示例列表文本文件(每行一个单词): 我想获得: John J0hn 45John Smith Sm1th Jane 333Jane 555Doe 12345 John J0hn Smith Sm1th Jane Doe 12345 这是:我想删除单词末尾的数字(注意单词中的数字是允许的),然后(只要行相同)删除重复的 请注意,只有字母前的数字必须删除,因此12345将保留在列表中。 我在编程方面有一些经验,所以我可以实现一些循环来检查这些数字,然后再实现另一个循环来删除重复的单词,但
John
J0hn
45John
Smith
Sm1th
Jane
333Jane
555Doe
12345
John
J0hn
Smith
Sm1th
Jane
Doe
12345
这是:我想删除单词末尾的数字(注意单词中的数字是允许的),然后(只要行相同)删除重复的请注意,只有字母前的数字必须删除,因此
12345
将保留在列表中。
我在编程方面有一些经验,所以我可以实现一些循环来检查这些数字,然后再实现另一个循环来删除重复的单词,但我认为Linux Shell必须有一些简单的命令或参数扩展来解决这个问题
删除原始文件排序是一种可能,但如果某些方法不需要,则可以删除。此类“字典”文本文件中不应出现空白 欢迎提出意见。谢谢你 预期用途:
- 隔离密码数据库中使用的单词(John,45John,12345John),以获得多样性的统计信息
perl
、awk
和sed
的语法,
所以我宁愿问,而不是做自己一些奇怪的模,可以
导致灾难
您可以为此使用sed:
sed -r 's/^[0-9]+(.*[^0-9].*)$/\1/g'
如果我在你的文件上运行这个,我会得到:
John
J0hn
John
Smith
Sm1th
Jane
Jane
Doe
12345
然后可以使用perl
:
其中:
John
J0hn
Smith
Sm1th
Jane
Doe
12345
您应该使用sed答案,这将非常快,但为了好玩,这里有一个纯posix shell的答案,因为您的问题是关于shell脚本:
while read i; do
o="$i"
while 1; do
l=${i#[0-9]}
[ "$l" == "$i" -o -z "$l" ] && break
i="$l"
done
[ -z "$i" ] && echo "$i" || echo $o
done < file.txt
阅读时;做
o=“$i”
1;做
l=${i#[0-9]}
[“$l”==“$i”-o-z“$l”]&&break
i=“$l”
完成
[-z“$i”]&&echo“$i”| | echo$o
完成
(好吧,我作弊了,[(aka/bin/test)并不总是一个内置命令。)这应该可以做到:
sed -r 's/^[0-9]+([A-Za-z])/\1/g' | sort -u
regexp在行首匹配一个数字序列,后跟一个字母。捕获组获取该字母,整个匹配将替换为该字母
管子到<代码>排序-U/COD>去掉重复。
如果单词前面和单词里面有数字,例如“代码> 1234 Jo7n?你可能忘记了Johns中的一个;”@ Barmar,这样的代码> 1234 Jo7n < /代码>必须变成<代码> Jo7n。中间的数字不是问题。红色链接。回答得很好。的确,这个问题是关于shell脚本的,但我见过的几乎所有shell脚本都使用其他程序。毕竟,shell的任务是将用户程序分组在一起,而不是提供一个新的编程环境:)。你完全正确!我这样做只是为了娱乐,理智的人应该使用sed:P不仅仅是为了娱乐,@serialk。在一些嵌入式环境中,比如路由器,你的答案可能对我非常有用。谢谢你。除了[a-z]
和[a-z]之外,不要使用任何其他字符
,例如45John-
。最初的帖子建议是不应使用空格
,但没有告诉任何其他字符。@sopalajodearierez:修改,我猜已修复。除了[a-z]
和[a-z]之外,不使用任何其他字符
,例如45John-
。最初的帖子建议是不需要空格
,但没有告诉任何其他字符。
sed -r 's/^[0-9]+([A-Za-z])/\1/g' | sort -u