删除特定行中的重复字符串

删除特定行中的重复字符串

我在多台机器上有一个配置文件,其中特定行中有一些重复的字符串。

Option1 value
Option2 value
Option3 value
# Option X value
# commentary lines
... 
AllowList user1@ip1 user1@ip2 user2@ip3 user2@ip4 user1@ip1 user1@ip2 user2@ip3 user2@ip4 ... 
...
Option Z value

行中AllowList存在重复值。如何摆脱它们?

我已经知道如何删除重复值:

grep AllowList myconfig | tr ' ' '\n' | sort | uniq | xargs

但我想就地做到这一点,而保持其他线路完好无损。

答案1

perl 怎么样,用uniq(或uniqstr) from List::util

$ perl -MList::Util=uniq -alpe '$_ = join " ", uniq @F if $F[0] eq "AllowList"' myconfig
Option1 value
Option2 value
Option3 value
# Option X value
# commentary lines
...
AllowList user1@ip1 user1@ip2 user2@ip3 user2@ip4 ...
...
Option Z value

您可以添加-i以进行就地操作。

答案2

allowlist.awk:

/AllowList/{
  for(i=1;i<=NF;i++){
    #Check if the field is a repeated in the line, print the field if not.
    if(!a[$i]++){
      printf "%s ",$i
    }
  }
  split("",a) #Equivalent to delete(a)
  print ""    #Print a newline
  next
}
1

执行awk脚本并覆盖原始文件。

awk -f allowlist.awk myconfig > temporary
mv temporary myconfig

答案3

从文件中挑选出相关行,将其拆分为行,使用唯一性属性进行排序,然后再次将其连接在一起

grep '^AllowList' file | tr ' ' '\n' | LC_ALL=C sort -u | xargs

使用您的示例,这提供了以下结果

AllowList user1@ip1 user1@ip2 user2@ip3 user2@ip4

它预设行上唯一以大写字母开头的“单词”是关键字AllowList,并使用此假设将其放置在已排序行的开头。

相关内容