私たちの会社で利用可能なホスト名のリストがあります。
たとえば、
- グースワスト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つ以上の数字が続きます。
どちらもマッチングに正規表現を使用しますが、デフォルトの正規表現とsed
Perlgrep -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=locale
grep
sed
あるいは、libpcre(GNUによって使用されるライブラリ)に付属する実装例pcregrep
:grep
grep -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