Sed
如何在字元串中的數字之前提取單個字元
我有一個列表,其中包含我們公司可用的主機名稱。
例如 :
- gswast03
- gkjbossp1
- frdwop04
數字前的最後一個字元
t
,p
,q
代表主機的環境。所有字元串都以數字結尾。
t
用於測試p
用於產品q
質量保證我需要一個正則表達式來獲取導致主機名和主機名的數字的字元(我需要單個字元串的解決方案,而不是文件中的所有列表)
例如 :
gswas ***t*** 03
在這個字元串中,我只想提取
t
字元。先感謝您。
由於您已經用
grep
and標記了問題sed
,我假設字元串列表表示為某些文本輸入的每行一個項目。然後:
sed -n 's/^.*\([^[:digit:]]\)[[:digit:]]\{1,\}$/\1/p' < that-input
或(假設 GNU
grep
或與類似 perl 的正則表達式支持兼容):grep -Po '\D(?=\d+$)' < that-input
將輸出在以非數字結尾的行中的尾隨數字之前的非數字字元,後跟 1 個或多個數字。
兩者都使用正則表達式進行匹配,但
sed
使用基本正則表達式,同時grep -P
使用類似 perl 的正則表達式。一些
sed
實現-P
也支持,但不是最常見的。對擴展正則表達式的多種支持-E
,這是正則表達式的另一種方言。和那些:sed -E -n 's/^.*([^[:digit:]])[[:digit:]]+$/\1/p' < that-input
或者你可以只使用
perl
它自己:perl -lne 'print $1 if /(\D)\d+$/' < that-input
(注意
perl
預設情況下在字節級別而不是字元級別工作,請參閱-C
告訴它將輸入解釋為 UTF-8 字元的選項,或者-Mopen=locale
根據語言環境的編碼對輸入/輸出進行解碼/編碼,例如grep
/sed
通常這樣做)。或者, libpcre(GNU 使用的庫)附帶
pcregrep
的範例實現:grep``grep -P
pcregrep -o1 '(\D)\d+$' < that-input