web-dev-qa-db-ja.com

アンパサンド(&)を使用して一致したパターン内の文字を置き換える方法

Sedを使用してパターンを照合すると、一致したパターンは「アンパサンド」(&)変数に格納されます。 ISアンパサンド自体を使用して、この一致したパターンの文字を置き換える方法はありますか?

たとえば、&に文字列「Apple1」が含まれている場合、&を使用して文字列を「Apple2」にするにはどうすればよいですか(つまり、1を2に置き換えます)?

18
user1418321

私が正しく推測した場合、あなたがしたいことは、一致したパターンに置換を適用することです。 &を使用してそれを行うことはできません。代わりにこれを実行します。

echo Apple1 Apple3 Apple1 Apple2 botemo1 | sed '/Apple./ { s/Apple1/Apple2/g; }'

これは、パターン/Apple./に一致する行でのみコマンド置換を実行することを意味します。

23
Elias Dorneles

キャプチャグループを使用することもできます。キャプチャは、一致の一部を取得して、キャプチャが表示される順序で数値的に名前が付けられた補助変数に保存するために使用されます。

echo Apple1 | sed -e 's/\(a\)\(p*\)\(le\)1/\1\2\32/g'

3つのキャプチャを使用しました。

  1. \1に格納されている最初の1つには「a」が含まれています
  2. \2に格納されている2番目のものには、「p」のシーケンスが含まれています(この例では「pp」が含まれています)。
  3. \3に格納されている3番目のものには、シーケンス「le」が含まれています。

これで、キャプチャした一致\1\2\32を使用して置換を印刷できます。 「Apple」を生成するために3つのキャプチャ値を使用し、次に2を追加していることに注意してください。合計9つのキャプチャしか存在できないため、これは変数\32として解釈されません。

これが役立つことを願って=)

最初にパターンを照合し、一致した場合はテキストを変更できます。

echo "Apple1" | sed '/Apple/s/1/2/'    # gives you "Apple2"

このコードは12Appleを含むすべての行

13
none

これはあなたのために働くかもしれません(GNU sedとBash):

sed 's/Apple1/sed "s|1|2|" <<<"&"/e' file
2
potong