SED: как заменить символ в соответствии с шаблоном с использованием амперсанда (&)
Когда мы сопоставляем шаблон с помощью sed, сопоставленный шаблон сохраняется в переменной "амперсанд" (&). Есть ли способ заменить символ в этом совпадающем шаблоне, используя сам амперсанд?
Например, если и содержит строку "apple1", как я могу использовать и сделать строку "apple2" (например, заменить 1 на 2)?
Ответы
Ответ 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