【问题标题】:search and delete duplicate entries inside a file for a line搜索并删除文件中的重复条目以查找行
【发布时间】:2017-01-14 03:18:12
【问题描述】:

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

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

条目可以按任何顺序排列。

【问题讨论】:

  • 所有--insecure etc 条目是否总是彼此相邻?如果有的话,你尝试过什么?

标签: awk sed grep ansible


【解决方案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

【讨论】:

    【解决方案2】:

    这是我基于 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)。第二部分包含其他所有内容。然后我们从第二部分中删除所有出现的字符串。最后,我们将这两个部分连接起来并输出。

    【讨论】:

      【解决方案3】:

      假设:--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
      

      【讨论】:

        猜你喜欢
        • 2016-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 2020-09-04
        • 2017-08-29
        • 2013-12-22
        • 1970-01-01
        相关资源
        最近更新 更多