次のファイルがあります。
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
new_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