
我試圖替換所有這一行,但數字:
looktype="123"
所以只顯示數字。
這可以透過任何簡單的方式實現嗎?
{sub ("look type=\"[0-9]{0,3}", "TEST")}
我正在嘗試這個awk
,但沒有成功。我相信「sub」和 {0, 3} 會產生幹擾。
答案1
在擴展正規表示式(ERE),表示在和次之間重複。 awk 實作了擴展的正規表示式,但是 awk 的歷史實作沒有這種用於重複間隔的大括號語法。這X{m,n}
X
m
n
POSIX標準指定 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
。