繁体   English   中英

如何生成与模式不匹配的字符串元素?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM