Linux 如何删除文本行中的重复项?
我找不到任何关于如何做这件事的信息。我阅读了uniq上的文档,但它只处理重复的行,我需要删除同一行中的重复字符串 假设我有Linux 如何删除文本行中的重复项?,linux,string,sed,replace,duplicates,Linux,String,Sed,Replace,Duplicates,我找不到任何关于如何做这件事的信息。我阅读了uniq上的文档,但它只处理重复的行,我需要删除同一行中的重复字符串 假设我有 TodayToday is an an array 我需要它来输出 Today is an array 谢谢 uniq适用于整行,处理行内容的合适工具是sed(您也可以使用awk或Perl来执行这些一行程序的其他方法) 既然您在评论中说您已经使用了sed,并将您的问题标记为“linux”,那么您将如何使用GNU sed根据提供的测试用例,使用相同的大小写顺序来获得重复删
TodayToday is an an array
我需要它来输出
Today is an array
谢谢
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-insentive标志):
如果要将由空格分隔的词组(如“Today is a arrayToday is a array”)视为重复,可以这样做(在匹配集中添加空格):
然而,这样做并不允许regexp决定不更改诸如“nana”之类的单词
但是我们可以放心地说我们吃了“香蕉”,因为在regexp之前引入了\b
单词边界,以解决@purplepsycho提请我们注意的情况:
$ echo 'We eat banana' | sed -e 's/\b\([a-z ]\+\)\1/\1/gi'
We eat banana
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-insentive标志):
如果要将由空格分隔的词组(如“Today is a arrayToday is a array”)视为重复,可以这样做(在匹配集中添加空格):
然而,这样做并不允许regexp决定不更改诸如“nana”之类的单词
但是我们可以放心地说我们吃了“香蕉”,因为在regexp之前引入了\b
单词边界,以解决@purplepsycho提请我们注意的情况:
$ echo 'We eat banana' | sed -e 's/\b\([a-z ]\+\)\1/\1/gi'
We eat banana
您可以使用Ruby执行此操作:
$ echo 'TodayToday is an an array' | ruby -lape 'gsub(/\b([a-zA-Z ]+)\1/, "\\1")'
Today is an array
给定单词边界,它与banana
:
$ echo 'TodayToday is an an banana' | ruby -lape 'gsub(/\b([a-zA-Z ]+)\1/, "\\1")'
Today is an banana
与Perl类似:
$ echo 'TodayToday is an an banana' | perl -lape 's/\b([a-zA-Z ]+)\1/\1/g'
Today is an banana
因为它本质上是与相同的模式,所以应用相同的观察结果 您可以使用Ruby实现这一点:
$ echo 'TodayToday is an an array' | ruby -lape 'gsub(/\b([a-zA-Z ]+)\1/, "\\1")'
Today is an array
给定单词边界,它与香蕉一起工作:
$ echo 'TodayToday is an an banana' | ruby -lape 'gsub(/\b([a-zA-Z ]+)\1/, "\\1")'
Today is an banana
与Perl类似:
$ echo 'TodayToday is an an banana' | perl -lape 's/\b([a-zA-Z ]+)\1/\1/g'
Today is an banana
因为它本质上是与相同的模式,所以应用相同的观察结果 查看此链接可能会帮助您删除重复的行,我需要删除同一行中的重复字符串。这将是sed的工作,而不是uniq。这很好,因为我一直使用的是sed来处理这些内容,我只是不知道如何做。我不确定你的意思,在您提供的测试用例中,执行此操作
echo'TodayToday是一个数组'| sed-e's/\([a-z]\+\)[^\1]\1/\1/g'
givesToday是一个数组。查看此链接可能会帮助您删除重复的行,我需要删除同一行中的重复字符串。这将是sed的工作,不是uniq。这很好,因为我一直在使用sed来处理这些东西,我只是不知道怎么做。我不确定你的意思,今天这样做echo'是一个数组“| sed-e's/\([a-z]\+\)[^\1]\1/\1/g'
在你提供的测试用例中,今天是一个数组。警告,你不能说你在吃香蕉我有这个翅膀攻击
,它对这行没有任何作用。我更新了答案,以覆盖多个单词的重复序列,在集合中添加空格字符,不过,@purplepsycho是对的,因为你想覆盖重复序列,无论是否由空格分隔,都没有简单的方法来区分“香蕉”或名为“娜娜”的人是要更正的序列。[^\1]
没有使用反向引用,它只是“除了\
或1
之外的任何字符”,因为\
在字符类中并不特殊。@BenjaminW。对,但是删除它会使建议的regexp与“array”中的“rr”匹配,并将其转换为“aray”。。。我不知道为什么。另一种策略是在表达式的开头检查单词边界。这将解决“香蕉”的问题(但“娜娜”仍然无法解决),我正在更新提议的答案。警告,你不能说你在吃香蕉我有这个翅膀攻击
,它对这行没有任何作用。我更新了答案,以覆盖多个单词的重复序列,在集合中添加空格字符,不过,@purplepsycho是对的,因为你想覆盖重复序列,无论是否由空格分隔,都没有简单的方法来区分“香蕉”或名为“娜娜”的人是要更正的序列。[^\1]
没有使用反向引用,它只是“除了\
或1
之外的任何字符”,因为\
在字符类中并不特殊。@BenjaminW。对,但是删除它会使建议的regexp与“array”中的“rr”匹配,并将其转换为“aray”。。。我不知道为什么。另一种策略是在表达式的开头检查单词边界。这将解决“香蕉”的问题(但“娜娜”仍然无法解决),我正在用这一点更新提议的答案。