[英]How to generate string elements that don't match a pattern?
如果我有
days="1 2 3 4 5 6"
func() {
echo "lSecure1"
echo "lSecure"
echo "lSecure4"
echo "lSecure6"
echo "something else"
}
并做
func | egrep "lSecure[1-6]"
然后我明白了
lSecure1
lSecure4
lSecure6
但我想要的是
lSecure2
lSecure3
lSecure5
这是没有lSecure
字符串的所有日子。
题
我目前的想法是使用awk
分割$days
然后遍历所有组合。
有没有更好的办法?
请注意,grep -v会反转普通grep的意义,并且不会解决问题,因为它不会生成所需的字符串。
为了类似的目的,我通常使用grep的-f
标志。 <( ... )
代码生成一个包含所有可能性的文件,grep只选择那些不存在于func中的文件。
func | grep 'lSecure[1-6]' | grep -v -f- <( for i in $days ; do echo lSecure$i ; done )
或者,你可能更喜欢它反过来:
for i in $days ; do echo lSecure$i ; done | grep -vf <( func | grep 'lSecure[1-6]' )
一个awk
解决方案:
$ func | awk -v i="${days}" 'BEGIN{split(i,a," ")}{gsub(/lSecure/,"");
for(var in a)if(a[var] == $0){delete a[var];break}}
END{for(var in a) print "lSecure" a[var]}' | sort
我们将它存储在awk数组中a
然后读取一行,获取最后一个数字,如果它存在于数组中,则从数组中删除它。 所以最后,在数组中,只剩下那些尚未找到的元素。 排序只是以排序的方式呈现:)
F=$(func)
for f in $days; do
if ! echo $F | grep -q lSecure$f; then
echo lSecure$f
fi
done
我不确定你想要实现什么,但你可以考虑使用uniq -u
来删除重复的序列。 例如,你可以用它来做到这一点:
( echo "$days" | tr -s ' ' '\n'; func | grep -oP '(?<=lSecure)[1-6]' ) | sort | uniq -u
输出:
2
3
5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.