Вы можете заменить шаблон регулярного выражения, используя awk
на sub
(первая подходящая подстрока, sed
"s///
") или gsub
(подстановка соответствующих подстрок глобально, sed
"s///g
") , Сами регулярные выражения не будут различаться между sed
и awk
. В вашем случае вы хотите:
Решение 1
РЕДАКТИРОВАТЬ: отредактировано в соответствии с комментариями
Следующая awk
ограничит замену данной подстрокой (например, 'POSA _____ POSB'):
echo "OOPS POSA_____POSB" | awk '{str="POSA_____POSB"}; {gsub(/[POSAB]/,"&@",str)}; {gsub(/'POSA_____POSB'/, str); print $0} '
Если ваш ввод состоит только из совпадающей строки, попробуйте следующее:
echo "POSA_____POSB" | awk '{gsub(/[POSAB]/,"&@");}1'
Объяснение:
Отдельные '{}' для каждого действия и явные print
для ясности.
gsub
принимает 3 аргумента gsub(pattern, substitution [, target])
, где target должен быть переменным (gsub
изменит его на месте и сохранит результат там).
Мы используем var с именем 'str' и инициализируем его значением (вашей строкой) перед выполнением любых подстановок.
Второй gsub
предназначен для помещения измененного str
в $0
(соответствует всей записи / строке).
Выражения greedy
по умолчанию --- они будут соответствовать самой длинной возможной строке.
[]
вводит набор символов для сопоставления: каждый случай любого символа будет сопоставлен. Выражение выше говорит awk
, чтобы соответствовать каждому вхождению любого из "POSAB".
Ваше первое регулярное выражение работает не так, как ожидалось, поскольку вы sed
указали, что оно соответствует POS
, оканчивающемуся на любое из [AB]
(вся строка сразу).
В другом выражении вы указали, что он соответствует любому отдельному символу (включая «_»), когда вы использовали: '.'
(точка).
Если вы хотите обобщить это решение, вы можете использовать: [\w]
выражение, которое будет соответствовать любому из [a-zA-Z0-9_]
или [a-z]
, [A-Z]
, [0-9]
, чтобы соответствовать строчным, прописным буквам и цифрам соответственно.
Решение 2
Обратите внимание, что вы можете отрицать наборы символов с помощью [^]
, поэтому: [^_]
также будет работать в этом конкретном случае.
Объяснение:
Отрицание означает: сопоставить что угодно, кроме символа между '[]'. Символ '^' должен быть первым символом, сразу после открытия '['.
Sidenotes:
Также может быть хорошей идеей напрямую указать, что вы хотите сопоставить один символ за раз с [POSAB]?
или [POSAB]{1}
.
Также обратите внимание, что в некоторых реализациях sed
может потребоваться ключ -r
для использования расширенных (более сложных) регулярных выражений.