私はユーザーに2つの別々の単語を入力させ、結果に2つの単語がどの文字を共有するかを示すスクリプトを作成しています。たとえば、./share Cat Rat - 共有文字「a」と「t」を返します。私の考えは$ 1と$ 2を繰り返すことですが、その後はどこに行くのかわかりません。私は今スクリプティングとUNIXを学び始めました。どうぞよろしくお願いします!
#!/bin/sh
echo "$1"|while read line
ベストアンサー1
Bashに組み込まれている正規表現(=~
演算子など)と配列変数を使用できる場合は、次のように使用できます。
#!/bin/bash
W1=( $( echo "$1" | sed "s/./\n&/g" | sort -u ) )
W2="$2"
set ${W1[*]}
while [[ ! -z "$1" ]]; do
if [[ "$W2" =~ "$1" ]]; then
printf "$1 "
fi
shift
done
printf "\n"
最初の行は、に含まれる各文字を含む配列を作成します$1
。次に、$2
位置パラメータを保存し、$W1
要素の値に設定します。その後、各文字(現在の位置引数)は、2番目の保存された単語と一致し、一致するものがあれば印刷されます。最後に、位置パラメータが移動され、ループが次の文字に続きます。
ここで見ることができる概念は、配列の使用、コマンド出力を変数としてキャプチャ、位置引数の変更、ループ、および条件文です。
これを簡単にするには、次の点を考慮することをお勧めします(実際には読みやすくするために1行に分割します)。
#!/bin/bash
printf "$1" \
| sed "s/./\n&/g" | sort -u \
| grep -F "$( printf "$2" | sed 's/./&\n/g' | sort -u )"
これらのsed | sort -u
組み合わせは、単に単語を1行に1つの一意の文字に分割します。grep -F
引数(ここでは分割秒の単語)を入力で一致させる固定文字列として扱うので、 のすべての文字を のすべての文字$1
と一致させようとします$2
。実際の状況では、sort | uniq
「単語」は通常非常に短く、2つの追加プロセスを作成するとパフォーマンスの向上が中断されるため、2番目の組み合わせを排除できます。ただし、$2
規模が大きくなったら(数百行または数千行)、すべての可能な最適化を実行したいと思います。
ほぼ同じタスクを実行するsed
whichコマンドを置き換えることもできます(入力に時間がかかりませんが、そのコマンドはテキスト処理のスイス軍用ナイフと同じです)。fold -w 1
sed
s