18

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

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

4

4 に答える 4

25

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

echo apple1 apple3 apple1 apple2 botemo1 | sed '/apple./ { s/apple1/apple2/g; }'

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

于 2012-10-02T17:13:33.333 に答える
18

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

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

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

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

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

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

于 2012-10-02T17:38:58.930 に答える
13

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

echo "apple1" | sed '/apple/s/1/2/'    # gives you "apple2"

このコードは、次を含むすべての行でに変更1されます2apple

于 2012-10-02T16:45:15.750 に答える
2

これはうまくいくかもしれません (GNU sed と Bash):

sed 's/apple1/sed "s|1|2|" <<<"&"/e' file
于 2012-10-02T19:40:31.227 に答える