Я не совсем знаком с возможностями поиска и замены Notepad++, но sed
Unix очень похож.
Я полагаю, что вы никак не можете получить точный результат, который вы хотите, с точной замененной строкой, которую вы показали, потому что вы хотите пробелы перед испанскими именами ( Maria
, Juan
и т.д.), Но таких входных данных нет текст.
Вам нужно будет добавить хотя бы один пробел в строку замены.
Опция -r
указывает sed
использовать «расширенные регулярные выражения».
Нам не нужен этот вариант, но
sed
(по умолчанию) использует (
и )
для сопоставления скобок и \(…\)
для захвата группы, в то время как
sed -r
использует \(
и \)
для сопоставления буквенных скобок и (…)
для захвата группы.
Вы, кажется, ожидаете, что сможете использовать (…)
для захвата группы, поэтому я сделаю это с -r
.
Вы можете сделать это одной заменой в sed
с
sed -r 's/\s([A-Za-z]*)\s\(([A-Za-z]*)\)(,| and)*/\n\1 = \2/g'
Это можно разбить на
sed -r 's/ \s ([A-Za-z]*) \s \( ([A-Za-z]*) \) (,| and)? / \n\1 = \2 /g'
s/
- начать замену команды.
\s
- пробел.
В sed
вы можете использовать реальные символы пробела; Я подозреваю, что это верно и для Notepad++.
В sed
вы также можете использовать [[:space:]]
.
Конечно, пробел соответствует только пробелу, но \s
и [[:space:]]
соответствуют пробелу или табуляции.
([A-Za-z]*)
- группа захвата любого количества букв (верхнего или нижнего регистра), чтобы соответствовать английской версии имени.
В sed
вы также можете использовать [[:alpha:]]
(или [[:upper:]]
или [[:lower:]]
, по желанию).
\s
- другое пространство
\(
- буквальная скобка слева (та, что перед испанской версией названия).
([A-Za-z]*)
- то же, что и выше - группа захвата любого количества букв (верхний или нижний регистр), чтобы соответствовать испанской версии имени.
\)
- буквальная круглая скобка справа (та, что после испанской версии названия).
(,| and)?
- группа, которая соответствует ,
или and
, ноль или один раз.
Это соответствует материалу, который находится между правой скобкой после испанской версии имени и следующей английской версией имени.
Нам нужно иметь возможность обрабатывать ноль вхождений этой группы, потому что мы должны соответствовать Joseph (Jose)
, даже если после него нет запятой или « and
».
Обратите внимание, что мы могли бы использовать \sand
вместо and
; Я верю в это and
гораздо более читабелен.
Также обратите внимание, что мы могли бы использовать *
(ноль или более, без ограничений) вместо ?
,
/
- конец строки поиска; начало строки замены.
\n\1 = \2
- строка замены (новая строка, первая группа захвата, =
и вторая группа захвата).
Как упоминалось ранее, я добавил пробелы до и после =
.
/g
- конец команды.
g
означает «глобальный» и указывает, что подстановка должна выполняться столько раз, сколько это возможно (по умолчанию используется один раз на строку).
Таким образом, команда Notepad++, вероятно, очень похожа.