Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何删除文本行中的重复项?_Linux_String_Sed_Replace_Duplicates - Fatal编程技术网

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

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根据提供的测试用例,使用相同的大小写顺序来获得重复删

我找不到任何关于如何做这件事的信息。我阅读了uniq上的文档,但它只处理重复的行,我需要删除同一行中的重复字符串

假设我有

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'
gives
Today是一个数组。查看此链接可能会帮助您删除重复的行,我需要删除同一行中的重复字符串。这将是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”。。。我不知道为什么。另一种策略是在表达式的开头检查单词边界。这将解决“香蕉”的问题(但“娜娜”仍然无法解决),我正在用这一点更新提议的答案。