sed を使用して数字と文字パターンを置き換えます。

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-ce5e3ee6c6bfnew_text

つまり、new_text値がある場合は、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

答え1

\{..\}数量子を使用して、文字クラスが一致する必要がある回数を指定できます。

sed -e "s/wmd v0\.0\.0-[0-9]\{14\}-[0-9a-f]\{12\}/wmd v0.0.0-$new_text/"
#               ~  ~   ~~~~~~~~~~~~~~~~~~~~~~~~~~

また、ドットは正規表現で特別な意味を持ちます。バックスラッシュを使用すると、文字通り一致します。

また、$new_textスラッシュまたはsedに固有の他の文字を含めると、コマンドが中断される可能性があります。

答え2

使用幸せ(以前の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

関連情報