1

ウェブ上で、配列の要素が文字列に存在するかどうかを確認するための回答を見つけました。しかし、配列内の各要素が文字列に存在するかどうかを確認したいと考えています。

例えば。str1 = "This_is_a_big_sentence"

最初は str2 は次のようでした

str2 = "Sentence_This_big"

今、文字列 str1 に "sentence"&"this"&"big" が含まれているかどうかを検索したかった(3 つすべて、アルファベット順と大文字と小文字を無視)

だから私はarr=(${str2//_/ }) 今どのように進めますか、私はcommコマンドが交差点を見つけることを知っていますが、ソートされたリストが必要です._アンダースコアも無視する必要があります.

str2コマンドを使用して特定の種類のファイルの拡張子を見つけることで取得します

    for i in `ls snooze.*`; do echo    $i | cut -d "." -f2 
# Till here i get str2 and need to check as mentioned above. Not sure how to do this, i tried putting str2 as array and now just need to check if all elements of my array occur in str1 (ignore case,order)

どんな助けでも大歓迎です。私はこのリンクを使用しようとしました

4

5 に答える 5

0

別の文字列内の文字列からのすべての単語の存在を確認する awk ソリューションを次に示します。

str1="This_is_a_big_sentence"
str2="Sentence_This_big"

awk -v RS=_ 'FNR==NR{a[tolower($1)]; next} {delete a[tolower($1)]} END{print (length(a)) ? "Not all words" : "All words"}' <(echo "$str2") <(echo "$str1")

インデントあり:

awk -v RS=_ 'FNR==NR {
   a[tolower($1)]; 
   next
}
{ delete a[tolower($1)] }
END {
   print (length(a)) ? "Not all words" : "All words"
}' <(echo "$str2") <(echo "$str1")

説明:

  • -v RS=_レコードセパレーターを次のように使用します_
  • FNR==NR- このブロックを実行するstr2
  • a[tolower($1)]; nexta-各小文字の単語をキーとして配列に入力します
  • {delete a[tolower($1)]}str1-配列内の削除キー内の単語ごとにa
  • END- 配列の長さaが依然として 0 でない場合は、いくつかの単語が残っています。
于 2015-01-19T07:50:19.310 に答える
0

今、私はあなたが何を意味するかを知っています。これを試して:

#!/bin/bash

# add 4 non-matching examples
> snooze.foo_bar
> snooze.bar_go
> snooze.go_foo
> snooze.no_match

# add 3 matching examples
> snooze.foo_bar_go
> snooze.goXX_XXfoo_XXbarXX
> snooze.bar_go_foo_Ok

str1=("foo" "bar" "go")
for i in `ls snooze.*`; do
    str2=${i#snooze.}
    j=0
    found=1
    while [[ $j -lt ${#str1[@]} ]]; do
       if ! echo $str2 | eval grep \${str1[$j]} >& /dev/null; then
           found=0
           break
       fi
       ((j++))
    done
    if [[ $found -ne 0 ]]; then
        echo Match found: $str2
    fi
done

このスクリプトの結果の出力:

Match found: bar_go_foo_Ok
Match found: foo_bar_go
Match found: goXX_XXfoo_XXbarXX

または、上記の if..grep 行を次のように置き換えることができます。

if [[ ! $str2 =~  `eval echo \${str1[$j]}` ]]; then

bash の正規表現マッチを利用します。

注: 「\」や「 」 (スペース) などの検索文字列に含まれる特殊文字は、問題を引き起こす可能性があるため、あまり注意を払っていません。

--- いくつかの説明 ---

if .. grep 行では、$j は最初に実行中のインデックス (0 から $str1 の要素数から 1 を引いた数) まで評価されます。次に、eval はgrepコマンド全体を再度評価し、${str1[jjj] を引き起こします。 } 再評価する (ここで、jjj は評価済みのインデックスです)

戦略は、found=1 (デフォルトで見つかりました) に設定し、いずれかgrepが失敗した場合、found を 0 に設定し、内側の j ループを中断することです。

他のすべては簡単である必要があります。

于 2015-01-20T02:55:04.440 に答える
0

別の解決策は次のとおりです。

#!/bin/bash
str1="This_is_a_big_sentence"
str2="sentence_This_big"
var=0
var2=0

while read in
do
        if [  $(echo $str1 | grep -ioE $in) ]
        then
                var=$((var+1))
        fi
        var2=$((var2+1))
done < <(echo $str2 | sed -e 's/\(.*\)/\L\1/' -e 's/_/\n/g')

if [[ $var -eq $var2 && $var -ne 0 ]]
then
        echo "matched"
else
        echo "not matched"

このスクリプトが行うことは、str2をすべて小文字にsed -e 's/\(.*\)/\L\1/'することで、任意の文字を小文字に置換し、アンダースコア_\n次の sed 式で改行に置き換えます: sed -e 's/_/\n/g'、これは別の置換です。

次に、個々の単語が、str1と入力された単語を比較する while ループに入力されます。一致するたびにvarがインクリメントされ、while を繰り返すたびにvar2がインクリメントされます。の場合、 str2var == var2のすべての単語がstr1で見つかりました。それが役立つことを願っています。

于 2015-01-19T10:59:04.987 に答える