2

私が持っている場合

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 の意味を逆にして、必要な文字列を生成しないため問題を解決しないことに注意してください。

4

4 に答える 4

5

私は通常-f、同様の目的で grep のフラグを使用します。コードは<( ... )すべての可能性を含むファイルを生成し、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]' )
于 2013-05-21T12:42:17.783 に答える
2

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、行を読み取っているときに最後の番号を取得し、配列に存在する場合はそれを配列から削除します。したがって、最後に、配列には、見つからなかった要素のみが残ります。ソートは、ソートされた方法で提示することです:)

于 2013-05-21T13:03:38.833 に答える
2
F=$(func)

for f in $days; do
    if ! echo $F | grep -q lSecure$f; then
    echo lSecure$f
    fi
done
于 2013-05-21T13:04:05.583 に答える
1

何を達成しようとしているのか正確にはわかりませんが、uniq -u繰り返しシーケンスを削除するの使用を検討してください。たとえば、これを使用してこれを行うことができます:

( echo "$days" | tr -s ' ' '\n'; func | grep -oP '(?<=lSecure)[1-6]' ) | sort | uniq -u

出力:

2
3
5
于 2013-05-21T13:20:25.467 に答える