{} 的替代正規表示式

{} 的替代正規表示式

我試圖替換所有這一行,但數字:

looktype="123"

所以只顯示數字。

這可以透過任何簡單的方式實現嗎?

{sub ("look type=\"[0-9]{0,3}", "TEST")}

我正在嘗試這個awk,但沒有成功。我相信「sub」和 {0, 3} 會產生幹擾。

答案1

擴展正規表示式(ERE),表示在和次之間重複。 awk 實作了擴展的正規表示式,但是 awk 的歷史實作沒有這種用於重複間隔的大括號語法。這X{m,n}XmnPOSIX標準指定 awk 必須支援 ERE,但許多現有實作不相容。

使用 GNU awk,間隔僅從 4.0 版本開始支援。對於舊版本,您可以透過將POSIXLY_CORRECT環境變數設為非空值來強制 gawk 相容 POSIX :

POSIXLY_CORRECT=1 awk '{sub ("looktype=\"[0-9]{0,3}", "TEST"); print}'

某些發行版上 awk 的預設版本不是 gawk,而是 mawk,它更小、更快。 Mawk 不支援大括號表達式。有一個補丁可以解決這個問題,但由於 mawk 沒有得到維護,因此它沒有被廣泛採用。

當重複次數較少時,可拼出:

awk '{sub ("looktype=\"[0-9]?[0-9]?[0-9]?[0-9]?", "TEST"); print}'

答案2

您可以透過管道傳輸它sed以僅提取引號字元內的內容。

例如

$ echo 'looktype="123"' | sed -r -e 's/^.*"([^"]+)".*/\1/'
123

請注意,這-r是 GNU sed 特有的,它告訴 sed 使用擴充而不是基本正規表示式。其他版本sed沒有它,或者可以使用-E它。否則,用 POSIX 基本正規表示式 (BRE) 將其寫為:

sed -e 's/^.*"\([^"][^"]*\)".*/\1/'

答案3

awk(假設精確的輸入您發布的內容)您也可以這樣做:

awk -F'=' '{print $2}' | sed 's/"//g'

答案4

GNU 中的替代方案grep(我假設您有 Ubuntu 標籤):

grep -o '[0-9]\+' your_file

Perl 的更便攜的替代方案

perl -nle '/([0-9]+)/ and print $1' your_file

這兩種選擇並不完全相同。如果同一行上有多個數字字串實例,它們的行為會有所不同。該grep語句將在單獨的行上列印每個出現的數字,而該perl語句僅列印每行中最左邊出現的數字字串。這是由於 Perl 和正規表示式引擎內部實現的差異所造成的grep

相關內容