Text-Processing
用 sed 替換數字和字元模式
我有一個如下文件:
some arbitrary number of leading lines a prefix followed by wmd v0.0.0-20220406135915-ce5e3ee6c6bf some trailing lines
這只是文件外觀的一個範例。對於我感興趣的行,不變的部分是:
- 總是有
wmd v0.0.0-
,緊隨其後- 14 位數字,後跟
- 一個連字元,後跟
- 12 個字母數字字元
如何編寫一個
sed
命令,讓我20220406135915-ce5e3ee6c6bf
用 shell 變數中的值替換該部分new_text
?換句話說,如果
new_text
有 value99999999999999-aaaaaaaaaaaa
,我想找到會產生以下輸出<whatever goes here>
的命令部分:sed
$ sed -e "s/wmd v0.0.0-<whatever goes here>/wmd v0.0.0-$new_text/" my-file.txt some arbitrary number of leading lines a prefix followed by wmd v0.0.0-99999999999999-aaaaaaaaaaaa some trailing lines
您可以使用
\{..\}
量詞來指定字元類應匹配的次數。sed -e "s/wmd v0\.0\.0-[0-9]\{14\}-[0-9a-f]\{12\}/wmd v0.0.0-$new_text/" # ~ ~ ~~~~~~~~~~~~~~~~~~~~~~~~~~
另請注意,點在正則表達式中具有特殊含義。反斜杠以匹配字面意思。
另請注意,如果
$new_text
包含斜杠或其他一些對 sed 特殊的字元,則該命令可能會中斷。
使用Raku(以前稱為 Perl_6)
~$ raku -pe 's/ "wmd v0.0.0-" <( \d**14 \- \w**12 )> /99999999999999-aaaaaaaaaaaa/' my-file.txt #OR ~$ raku -pe 's[ "wmd v0.0.0-" <( \d**14 \- \w**12 )> ] = "99999999999999-aaaaaaaaaaaa";' my-file.txt
樣本輸入:
some arbitrary number of leading lines a prefix followed by wmd v0.0.0-20220406135915-ce5e3ee6c6bf some trailing lines
樣本輸出:
some arbitrary number of leading lines a prefix followed by wmd v0.0.0-99999999999999-aaaaaaaaaaaa some trailing lines
上面的正則表達式使用 4 個正則表達式原子來辨識匹配,
"wmd v0.0.0-"
,\d**14
,\-
, 和\w**12
。當然,如果引號有問題,"wmd v0.0.0-"
可以寫wmd \s v0 \. 0 \. 0 \-
(即所有非alnum
字元都被反斜杠轉義)。擷取標記
<( … )>
用於刪除 之外的所有內容\d**14 \- \w**12
,該標記在運算符的右半部分被替換s///
。請注意,在上面的程式碼
\w
中是 的簡寫<alnum>
,其中包括_
下劃線。如果您不想接受_
下劃線(實際上,可能是 12 個連續的_
下劃線字元),請改用類似的東西<[0..9a..z]>**12
。最後,您可以通過將替換抽象為變數來簡化替換,如下所示:
~$ raku -pe 'my $new = "99999999999999-aaaaaaaaaaaa"; \ s/ "wmd v0.0.0-" <( \d**14 \- <[0..9a..z]>**12 )> /$new/;' my-file.txt
https:raku.org