我在多台机器上有一个配置文件,其中特定行中有一些重复的字符串。
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
,并使用此假设将其放置在已排序行的开头。