如何从Bash脚本中的字符串中删除重复的单词?

Tha*_*ran 6 bash

我有一个包含重复单词的字符串,例如:

abc, def, abc, def
Run Code Online (Sandbox Code Playgroud)

如何删除重复项?我需要的字符串是:

abc, def
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 6

我们有这个测试文件:

$ cat file
abc, def, abc, def
Run Code Online (Sandbox Code Playgroud)

删除重复的单词:

$ sed -r ':a; s/\b([[:alnum:]]+)\b(.*)\b\1\b/\1\2/g; ta; s/(, )+/, /g; s/, *$//' file
abc, def
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

  • :a

    这定义了一个标签a.

  • s/\b([[:alnum:]]+)\b(.*)\b\1\b/\1\2/g

    这将查找由字母数字字符组成的重复单词,并删除第二次出现的单词.

  • ta

    如果最后一个替换命令导致更改,则会跳回标签a以再次尝试.

    通过这种方式,代码一直在寻找重复项,直到没有剩下.

  • s/(, )+/, /g; s/, *$//

    这两个替换命令可以清除剩余的逗号空间组合.

Mac OSX或其他BSD系统

对于Mac OSX或其他BSD系统,请尝试:

sed -E -e ':a' -e 's/\b([[:alnum:]]+)\b(.*)\b\1\b/\1\2/g' -e 'ta' -e 's/(, )+/, /g' -e 's/, *$//' file
Run Code Online (Sandbox Code Playgroud)

使用字符串而不是文件

sed可以轻松处理来自文件的输入,如上所示,或者来自shell字符串,如下所示:

$ echo 'ab, cd, cd, ab, ef' | sed -r ':a; s/\b([[:alnum:]]+)\b(.*)\b\1\b/\1\2/g; ta; s/(, )+/, /g; s/, *$//'
ab, cd, ef
Run Code Online (Sandbox Code Playgroud)