Подтвердить что ты не робот

SED: как заменить символ в соответствии с шаблоном с использованием амперсанда (&)

Когда мы сопоставляем шаблон с помощью sed, сопоставленный шаблон сохраняется в переменной "амперсанд" (&). Есть ли способ заменить символ в этом совпадающем шаблоне, используя сам амперсанд?

Например, если и содержит строку "apple1", как я могу использовать и сделать строку "apple2" (например, заменить 1 на 2)?

4b9b3361

Ответ 1

Если я правильно понял, что вы хотите сделать, это применить подстановку в сопоставленном шаблоне. Вы не можете сделать это, используя &. Вы хотите сделать это вместо этого:

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

Это означает, что вы хотите выполнить подстановку команд только в строках, соответствующих шаблону /apple./.

Ответ 2

Вы также можете использовать группу захвата. Захват используется для захвата части соответствия и сохранения ее во вспомогательную переменную, которая называется численно в порядке появления захвата.

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

Мы использовали три захвата:

  • Первый, сохраненный в \1, содержит "a"
  • Второй, сохраненный в \2, содержит последовательность "p" s (в примере содержит "pp" )
  • Третий, сохраненный в \3, содержит последовательность "le"

Теперь мы можем распечатать замену, используя полученные нами совпадения: \1\2\32. Обратите внимание, что мы используем 3 значения захвата для генерации "яблока", а затем добавляем 2. Это не будет интерпретироваться как переменная \32, потому что у нас может быть всего 9 захватов.

Надеюсь, что это поможет =)

Ответ 3

вы можете сначала сопоставить шаблон, а затем изменить текст, если он соответствует:

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

этот код меняет 1 на 2 во всех строках, содержащих apple

Ответ 4

Это может сработать для вас (GNU sed и Bash):

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