Sed

如何在字元串中的數字之前提取單個字元

  • July 25, 2020

我有一個列表,其中包含我們公司可用的主機名稱。

例如 :

  • gswast03
  • gkjbossp1
  • frdwop04

數字前的最後一個字元t, p,q代表主機的環境。所有字元串都以數字結尾。

  • t用於測試
  • p用於產品
  • q質量保證

我需要一個正則表達式來獲取導致主機名和主機名的數字的字元(我需要單個字元串的解決方案,而不是文件中的所有列表)

例如 :

gswas ***t*** 03

在這個字元串中,我只想提取t字元。

先感謝您。

由於您已經用grepand標記了問題sed,我假設字元串列表表示為某些文本輸入的每行一個項目。

然後:

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

或(假設 GNUgrep或與類似 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

引用自:https://unix.stackexchange.com/questions/600131