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