Это работает на моем Mac и различных дистрибутивах Linux:
#!/usr/bin/env bash
PATTERN="(GSM[0-9]{5})(AATF)"
sed -E -e $"s_${PATTERN}_\1\\
\2_g" < file_with_values
Где:
PATTERN
:вы можете определить шаблон в переменной, что упрощает чтение выражения подстановки sed -E -e
:установите sed
для использования расширенного регулярного выражения (-E )и для использования предоставленного скрипта (-e)$"..."
:используется для перевода строк и допускает использование переменных. Посмотрите здесь:bash, цитирующий . Это может быть безопасно не во всех ситуациях, но в вашем случае все должно быть в порядке s_..._...\2_g
:— строка замены; Я использую _
в качестве разделителей, так что вам не нужно экранировать /
и, учитывая, что вам нужны группы захвата(\1
и \2
), это просто облегчает чтение строки. Обратите внимание на \\
, за которым следует новая строка. $"..."
позволяет использовать новые строки Если вам не нужны переменные, вы можете использовать $'....'
, то есть знак доллара в одинарных кавычках. В этом случае вы можете использовать \n
, но не можете вставить новую строку
.
Использование $"..."
кажется вполне переносимым :мой код с похожей реализацией работает на docker alpine, centos, debian, fedora, ubuntu.