搜索并删除文件中一行的重复条目

时间:2016-09-06 15:35:03

标签: awk sed grep ansible

我有一个包含以下内容的文件

OPTIONS='--selinux-enabled -G dockerroot -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry my-demo-auto-images-releases-dev.cto.com --insecure-registry my-demo-auto-images-stable-dev.cto.com --insecure-registry my-demo-auto-images-releases-dev.cto.com --insecure-registry my-demo-auto-images-stable-dev.cto.com --insecure-registry my-demo-auto-images-snapshots-dev.cto.com'
DOCKER_CERT_PATH=/etc/docker

--insecure-registry my-demo-auto-images-releases-dev.cto.com--insecure-registry my-demo-auto-images-stable-dev.cto.com有重复的条目我只需要保留一次上述条目。

文件应该如下所示

OPTIONS='--selinux-enabled -G dockerroot -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry my-demo-auto-images-releases-dev.cto.com --insecure-registry my-demo-auto-images-stable-dev.cto.com --insecure-registry my-demo-auto-images-snapshots-dev.cto.com'
DOCKER_CERT_PATH=/etc/docker

参赛作品可以是任何顺序。

3 个答案:

答案 0 :(得分:1)

试试这个:

sed 's/--insecure-registry my-demo-auto-images-stable-dev\.cto\.com//2g;s/--insecure-registry my-demo-auto-images-releases-dev\.cto\.com//2g' file

它会删除第二次出现的两个字符串。

<强>输出:

OPTIONS='--selinux-enabled -G dockerroot -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry my-demo-auto-images-releases-dev.cto.com --insecure-registry my-demo-auto-images-stable-dev.cto.com   --insecure-registry my-demo-auto-images-snapshots-dev.cto.com  '
DOCKER_CERT_PATH=/etc/docker

答案 1 :(得分:0)

这是我基于perl的解决方案:

perl -pe 'for my $s ("--insecure-registry my-demo-auto-images-releases-dev.cto.com","--insecure-registry my-demo-auto-images-stable-dev.cto.com") {if (($a,$b)=/^(.*?$s)(.+)$/s) {$b=~s/$s //g; $_="$a$b"}}' input.txt

我们的想法是我们分别处理每一行。我们将其分为两部分:第一部分包含所有内容,包括要删除的字符串(例如-insecure-registry my-demo-auto-images-releases-dev.cto.com)。第二部分包含其他所有内容。然后我们从第二部分中删除所有出现的字符串。最后,我们连接两部分,然后输出。

答案 2 :(得分:0)

假设:--insecure条目组合在一起朝行尾

主要逻辑是初始部分被分离出来,--insecure条目放在一个数组中然后打印出唯一

$ perl -MList::MoreUtils=uniq -ne "if(/--insecure/){(@b)=/^(.*?)(?=--insecure.*)/; (@a)=/--insecure.*?(?= --|')/g; print \"@b\"; print join(' ',uniq(@a)); print \"'\n\"} else {print}" ip.txt
OPTIONS='--selinux-enabled -G dockerroot -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry my-demo-auto-images-releases-dev.cto.com --insecure-registry my-demo-auto-images-stable-dev.cto.com --insecure-registry my-demo-auto-images-snapshots-dev.cto.com'
DOCKER_CERT_PATH=/etc/docker