文字列から数字の前の単一文字を抽出する方法

文字列から数字の前の単一文字を抽出する方法

私たちの会社で利用可能なホスト名のリストがあります。

たとえば、

  • グースワスト03
  • gkjbossp1
  • frdwop04

数字の前の最後の文字は、tホストp環境qを表します。すべての文字列は数字で終わります。

  • t試験用
  • p製品の
  • q品質保証のため

ホスト名と数字につながる文字を取得するには正規表現が必要です。 (ファイルにすべてリストするのではなく、単一の文字列に対する解決策が必要です。)

たとえば、

クバスティー03

この文字列では文字だけを抽出したいと思いますt

よろしくお願いします。

答え1

grep私は質問にandとタグ付けしたので、文字列リストがいくつかのsedテキスト入力の1行に1つの項目として表示されるとします。

それから:

sed -n 's/^.*\([^[:digit:]]\)[[:digit:]]\{1,\}$/\1/p' < that-input

または(GNUgrepまたは互換ビルドにPerlと同様の正規表現サポートがあると仮定):

grep -Po '\D(?=\d+$)' < that-input

数字以外の文字で終わる行の末尾の数字の前に数字以外の文字を出力し、その後に1つ以上の数字が続きます。

どちらもマッチングに正規表現を使用しますが、デフォルトの正規表現とsedPerlgrep -Pに似た正規表現を使用します。

一部のsed実装では-Pこれをサポートしていますが、最も一般的ではありません。-E正規表現の別の方言である拡張正規表現のさまざまなサポート。そしてそれら:

sed -E -n 's/^.*([^[:digit:]])[[:digit:]]+$/\1/p' < that-input

あるいは、単独perlで使用することもできます:

perl -lne 'print $1 if /(\D)\d+$/' < that-input

perlデフォルトでは文字レベルではなくバイトレベルで動作します。入力をUTF-8文字として解釈するか、通常どおりロケールエンコーディングに従って入力/出力をデコード/エンコードするように指示する-Cオプションを参照してください。)-Mopen=localegrepsed

あるいは、libpcre(GNUによって使用されるライブラリ)に付属する実装例pcregrepgrepgrep -P

pcregrep -o1 '(\D)\d+$' < that-input

答え2

普通のバッシュで

shopt -s extglob
for host in "${hosts[@]}"; do
  tmp=${host%%+([[:digit:]])}   # strip the trailing digits
  echo "$host => ${tmp: -1}"    # extract the last character
done
gswast03 => t
gkjbossp1 => p
frdwop04 => p

または、正規表現の一致を使用します。

for host in "${hosts[@]}"; do
  if [[ $host =~ ([^[:digit:]])[[:digit:]]+$ ]]; then
    echo "$host => ${BASH_REMATCH[1]}"
  fi
done

答え3

.*([pqt])\d+$

後に ap、q、または t と 1 つ以上の数字が続くすべての文字と一致します。一致グループは、あなたが興味を持っている個々の文字です。

答え4

これは、すべてのUNIXシステムのすべてのシェル内のすべてのsedで機能します。

$ sed 's/.*\([^0-9]\).*/\1/' file
t
p
q

上記はこの入力ファイルに対して実行されました。

$ cat file
gswast03
gkjbossp1
frdwoq04

関連情報