同じ文字のインスタンスを 2 つだけ含む単語に一致する正規表現を探します。
では、文字「s」が 2 つしかない単語を探しているとしましょう。
テスト テスト サム アシスタント パス lessclose セッション
上記から、「s」のインスタンスが 2 つある唯一の単語であるため、「Tests」と「pass」のみを選択する必要があります。
#!/bin/bash
regex='^[^sS]*[sS][^sS]*[sS][^sS]*$'
for word in Test Tests Sam assistant pass
do
if [[ $word =~ $regex ]]; then
echo $word
fi
done;
これは、's' または 'S' ではない 0 個以上の文字で区切られた 2 つの 's' または 'S' 文字を探します。
要件をケースセンシティブではないと見なす
使用する:
echo "Test Tests Sams assistant pass lessclose session" | tr " " "\n" | awk '{FS="[sS]"} {if (NF==3) {print}}'
出力:
Tests
Sams
pass
それ以外の場合は、次を使用します。
echo "Test Tests Sams assistant pass lessclose session" | tr " " "\n" | awk '{FS="[s]"} {if (NF==3) {print}}'
出力:
Tests
pass
を使用した片道GNU awk
:
小文字の 's' 文字を 2 つだけ検索する場合:
awk '{ for (i=1; i<=NF; i++) if (gsub(/s/,"s",$i) == 2) print $i }' file.txt
大文字と小文字の 's' 文字を無視する場合 (つまり、's' または 'S' のいずれかに一致する場合)、以下を試してください。
awk '{ for (i=1; i<=NF; i++) { s_count = gsub(/s/,"s",$i); S_count = gsub(/S/,"S",$i); if (s_count + S_count == 2) print $i } }' file.txt
結果:
Tests
pass