BSD sedでパターンの一部を一致させて交換する方法は?

BSD sedでパターンの一部を一致させて交換する方法は?

私はGNU sedの魂を見つけ、似たようなものを見つけました\1が、端末はそれが「REで定義されていません」と言いました。

しかし、私がしたいのはこれです。

このような文字列がある場合は、sinder-city1.gifこれを実行したいと思いますsinder-city.gif。さまざまな文字列に対してこれを行うため、文字列全体を置き換えたり、.gifまたはその前のすべての数字を削除したりすることはできません。他のパターンがある場合

sinder-city2.gif
sinder-city3.gif

私は彼らがそのままになることを願っています。

私はそれを交換したくありません。一致させようと入るのをsed 's,[a-z]1.gif,除けばそれが残りますねsinder-cit.gif。どのように一致させますかy

私はこれをしたい:

sed 's,[a-z]1.gif,[here is the last letter].gif,g'

BSD sedで動作する必要があります。

ベストアンサー1

sed 's,\([a-z]\)1\.gif$,\1.gif,g'

または許可したい場合1

sed 's,\([^0-9]\)1\.gif$,\1.gif,g'

バックスラッシュ角かっこ構造は、キャプチャリンググループを区別します。FreeBSD マニュアルページ「角かっこ式」と呼ばれます(角かっこを使用しても、角かっこは異なる意味を表します)。 sedは拡張正規表現(ERE)ではなく、デフォルトの正規表現(BRE)を使用します。マニュアルページでは ERE について説明し、最後の段落では BRE 構文と ERE 構文の違いについて説明します。見つけました。POSIX仕様ここでは、キャプチャグループを呼び出してBSDのマニュアルページよりも読みやすくします。逆参照式。これGNU sed マニュアルどちらよりも読みやすいです。 GNU 拡張機能で説明することを避けます。

キャプチャリンググループ(逆参照式とも呼ばれます)が与えられると、代替テキストにバックスラッシュ+数字を使用して、「対応するキャプチャリンググループと一致するテキスト」を意味できます。たとえば、\1代替テキストのテキストは、正規表現の最初のキャプチャグループに一致するテキストで置き換えられます。これには、前の文字をキャプチャするキャプチャグループがあります1.gif

文字通り点を一致させる1.gifように変更し、行末のみに一致するように末尾を追加しました。1\.gif$

キャプチャリンググループの別の例を挙げると、任意の拡張に対してタスクを実行するには、次のようなものを使用できます。

sed 's,\([^0-9]\)1\(\.[^./]*\)$,\1\2,g'

おすすめ記事