-1

たとえば、「testthis」という文字列がアプリケーションに挿入されたとします。

grepワイルドカードに沿って考えていますが、実際に使用したことはありません。

4

3 に答える 3

2

スクリプトを書くことができます。

  1. 各文字を繰り返します。
  2. 見られるキャラクターごとに、キャラクターごとにカウンターをインクリメントします。
  3. 最後に、に等しいものがないかカウンターを確認します2
于 2012-10-02T04:23:14.433 に答える
1

これは、steveが行ったことを実行するalexの提案の純粋なbash実装ですawk

#!/bin/bash

# your string
string="test this"


# First, make a character array out of it
for ((i=0; i<"${#string}"; i++)); do  # (quotes just for SO higlighting)
    chars[$i]="${string:$i:1}"        # (could be space, so quoted)
done

# associative array will keep track of the count for each character
declare -A counts

# loop through each character and keep track of its count
for ((i=0; i<"${#chars[@]}"; i++)); do # (quotes just for SO higlighting)

    key="${chars[$i]}"              # current character 
                                    # (could be space, so quoted)

    if [ -z counts["$key"] ]; then  # if it doesn't exist yet in counts, 
        counts["$key"]=0;           # initialize it to 0
    else
        ((counts["$key"]++))        # if it exists, increment it
    fi

done

# loop through each key/value and print all with count 2
for key in "${!counts[@]}"; do
    if [ ${counts["$key"]} -eq 2 ]; then
        echo "$key"
    fi
done 

Bash 4.0で導入された連想配列を使用しているため、これはそれ以降でのみ機能することに注意してください。

于 2012-10-02T05:41:21.070 に答える
0

使用する1つの方法GNU awk

echo "$string" | awk -F '' '{ for (i=1; i<=NF; i++) array[$i]++; for (j in array) if (array[j]==2) print j }'
于 2012-10-02T04:41:25.653 に答える