我无法找到有关如何执行此操作的任何内容。我阅读了uniq上的文档,但它只处理重复的行,我需要在同一行中删除重复的字符串。
我们说我有
TodayToday is an an array
我需要它来输出
Today is an array
谢谢!
答案 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基本上是相同的模式,因此适用相同的观察结果。