簡體   English   中英

Linux命令sed中的正則表達式

[英]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 ,並且您已經說過要替換.*apka 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命令的任何初始字符串中出現。 有了這兩個事實,我們就可以拆分字符串。

注意:如果您想更換第二個apks/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM