[英]Regular Expression in Linux command sed
我有一個外殼變量:
all_apk_file="a 1 2.apk x.apk y m.apk"
我想用命令TEST
替換a 1 2.apk
:
echo $all_apk_file | sed 's/(.*apk ){1}/TEST/g'
.*apk
表示以apk
結尾, {1}
表示僅匹配一次,但不起作用; 我只有原始變量作為輸出: a 1 2.apk x.apk y m.apk
誰能告訴我為什么?
首先 ,要啟用您在sed
熟悉的正則表達式,您需要使用-r
開關(sed -r ...):
echo $all_apk_file | sed -r 's/(.*apk ){1}/TEST/g'
# returns TESTy m.apk
看看返回的內容: TESTy m.apk
。 這是因為.*
很貪婪 ,因此它盡可能匹配。 也就是說, .*
匹配a 1 2.apk x
,並且您已經說過要替換.*apk
, a 1 2.apk x.apk
.*apk
a 1 2.apk x.apk
為'TEST',從而得到TESTy m.apk
(請注意正則表達式中'.apk'之后的空格,這就是為什么匹配不會一直擴展到最后一個'.apk'的原因,后者后面沒有空格。
通常可以將.*
更改為.*?
使其不貪心 ,但sed不支持此行為。
因此,要解決此問題,只需使您的正則表達式更具限制性。
很難說出您要做什么-刪除前三個單詞的第三個末尾以“ .apk”結尾並替換為“ TEST”嗎? 在這種情況下,可以使用正則表達式:
[a-z0-9]+ +[a-z0-9]+ +[a-z0-9]+\.apk
與“ i”開關(不區分大小寫)結合使用。
您必須給出決定刪除哪些內容的邏輯(前三個單詞,直至第一個“ .apk”單詞的任意數量的單詞,等等),以便我們進一步幫助您使用正則表達式。
其次 ,將“ g”開關放入正則表達式中。 這意味着將替換所有匹配的模式,並且您似乎只希望替換第一個。 因此,刪除“ g”開關。
最后 ,所有這些結合在一起:
echo $all_apk_file | sed -r 's/[a-z0-9]+ +[a-z0-9]+ +[a-z0-9]+\.apk/TEST/i'
# TEST x.apk y m.apk
這可能對您有用:
echo "$all_apk_file" | sed 's/apk/\n/;s/.*\n/TEST/'
TEST x.apk y m.apk
至於為什么您的正則表達式不起作用,請參閱@ mathematical.coffee和@Jonathan Leffler的出色解釋。
s/apk/\\n/
是同義s/apk/\\n/1
,這意味着代替第一次出現的apk
與\\n
。 由於sed使用\\n
作為記錄分隔符,我們知道它不可能在傳遞給sed命令的任何初始字符串中出現。 有了這兩個事實,我們就可以拆分字符串。
注意:如果您想更換第二個apk
則s/apk/\\n/2
要求。 當然,對於apk
的最后一次出現, .*apk
起作用。
問題的一部分是,在常規sed
, ()
和{}
是模式中的普通字符,直到使用反斜杠轉義為止。 由於變量的值中沒有括號,因此正則表達式永遠不會匹配。 使用GNU sed
,您還可以使用-r
標志啟用擴展的正則表達式。 如果您解決了該問題,那么您將遇到.*
貪婪的問題,而g
修飾符實際上並不會改變任何內容:
$ echo $all_apk_file | sed 's/\(.*apk \)\{1\}/TEST/g'
TESTy m.apk
$ echo $all_apk_file | sed -r 's/(.*apk ){1}/TEST/g'
TESTy m.apk
$ echo $all_apk_file | sed -r 's/(.*apk ){1}/TEST/'
TESTy m.apk
$
它僅在此處停止,因為變量的回顯值中m.apk
沒有空格。
現在的問題是:您要替換的是什么? 這聽起來像“一切,直到單詞末尾第一次出現的apk
。 這很容易用Perl正則表達式中的尾隨上下文或非貪婪匹配來完成。 如果可以切換到Perl,請這樣做。 如果不是這樣,那么在正常的sed
正則表達式中它就並非無關緊要。
$ echo $all_apk_file | sed 's/^[^.]* [^.][^.]*\.apk /TEST /'
TEST x.apk y m.apk
$
這將查找沒有點的任何內容,其后是空格, .apk
有點,以及.apk
; 這意味着允許的第一個點是2.apk
的一個。 它適用於樣本數據; 如果該變量包含:
all_apk_file="a 1.2 2.apk m.apk y.apk 37"
您需要對此進行調整以滿足您的要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.