Text-Processing

用 sed 替換數字和字元模式

  • May 13, 2022

我有一個如下文件:

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有 value 99999999999999-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

引用自:https://unix.stackexchange.com/questions/702437