2016-09-06 73 views
0

我有以下內容搜索和刪除一個文件中重複條目的行

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 

條目可以按任何順序。

+0

將所有'--insecure etc'條目總是彼此相鄰?你有什麼嘗試,如果有的話? – Sundeep

回答

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 
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)。第二部分包含一切。然後我們從第二部分中刪除所有出現的字符串。最後我們連接兩部分,我們輸出它。

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