如何删除文本行中的重复项?

时间:2017-07-06 11:53:22

标签: linux string sed replace duplicates

我无法找到有关如何执行此操作的任何内容。我阅读了uniq上的文档,但它只处理重复的行,我需要在同一行中删除重复的字符串。

我们说我有

TodayToday is an an array

我需要它来输出

Today is an array

谢谢!

2 个答案:

答案 0 :(得分:4)

uniq适用于整行,处理行内容的正确工具是sed(您也可以使用awk或Perl来执行这些单行的其他方法)。

既然你在评论中说你已经使用了sed并且你标记了你的问题" linux",这里是你如何获得重复删除,使用相同的大写或小写序列,基于您使用 GNU sed 提供的测试用例:

$ echo 'TodayToday is an an array' | sed -e 's/\b\([a-zA-Z ]\+\)\1/\1/g'
Today is an array

如果你想要治疗" TodayTODay"作为重复,你可以这样做(添加i case-insentitive flag):

$ echo 'TodayTODay is an an array' | sed -e 's/\b\([a-z ]\+\)\1/\1/gi'
Today is an array

如果你想处理由空格分隔的单词组,例如"今天是一个数组今天是一个数组"作为重复,您可以这样做(在匹配集中添加空格):

$ echo 'Today is an arrayTODay is an array' | sed -e 's/\b\([a-z ]\+\)\1/\1/gi'
Today is an array

这样做,但不允许正则表达式决定不改变诸如" nana "

之类的单词
$ echo 'Her name was Nana' | sed -e 's/\b\([a-z ]\+\)\1/\1/gi'
Her name was Na

但是我们可以安全地说我们吃#34; 香蕉",在正则表达式之前引入\b字边界来解决由@引起我们注意的情况purplepsycho:

$ echo 'We eat banana' | sed -e 's/\b\([a-z ]\+\)\1/\1/gi'
We eat banana

答案 1 :(得分:1)

你可以用Ruby做到这一点:

$(document).ready(function(){
     chkAll();
})

给定单词边界,它适用于$ echo 'TodayToday is an an array' | ruby -lape 'gsub(/\b([a-zA-Z ]+)\1/, "\\1")' Today is an array

banana

与Perl类似:

$ echo 'TodayToday is an an banana' | ruby -lape 'gsub(/\b([a-zA-Z ]+)\1/, "\\1")'
Today is an banana

由于它与Tardis' GNU sed answer基本上是相同的模式,因此适用相同的观察结果。