Я хотел бы использовать sed
или perl
заменить все вхождения слова, у которого нет определенного слова перед ним.
Например, у меня есть текстовый файл, который содержит сюжет фильма, и я хочу заменить все вхождения фамилии персонажа на его имя, но только в том случае, если его имя не сразу перед фамилией.
Пример текста может выглядеть так:
John Smith and Jane Johnson talk about Smith's car.
Я хочу, чтобы это выглядело так:
John Smith and Jane Johnson talk about John's car.
Если бы я просто сделал sed 's/Smith/John/' file
, то я бы:
John John and Jane Johnson talk about John's car.
Имя, которое стоит перед фамилией, всегда будет одинаковым. Мне не нужно иметь дело с John Smith
и Frank Smith
. Мне просто нужен способ сопоставления Smith
, который не имеет John
предшествующего ему.
sed
regular-expression
perl
jonescb
источник
источник
Ответы:
Было бы легко с любым языком, где регулярные выражения способны смотреть назад. Конечно, Perl является первым в списке:
Слабым местом является наличие более одного несловесного символа между «Джоном» и «Смитом». К сожалению, квантификатор типа
+
for\W
вызовет ошибку «Переменная длина не реализована».источник
РЕДАКТИРОВАТЬ .. re ваш комментарий .. Вот новый сценарий, который не касается (например,) Уильям Смит. Он временно запутывает шаблоны, которые он сохраняет как Смит (без изменений).
Если вы беспокоитесь о мистере мистере миссис ... тогда это работает.
Вы можете обслужить Уильяма , добавив его имя в список или , например.
sed -r 's/\<(William|John|...
Это оригинальный скрипт
источник
() Будет захватывать не-Firstname перед LastName, поэтому они заменяются в обратном порядке.
редактировать
@ Manatwork, Жиль
Вы правы. Как насчет
Это, кажется, делает трюк.
источник
[^John]
соответствует один символ , который должен быть один изJ
,o
,h
илиn
. Я сомневаюсь, что это то, что вы хотели. В регулярных выражениях отсутствует конструкция отрицания (Perl имеет(?!…)
и(?<!…)
, но если вы думаете о нем как об отрицании, он, вероятно, не будет выполнять то, что вы ожидаете).sed
без него делает для раздутой sed логики ...temp1
почти всегда будет хорошо, но! следите за этим автобусом. Чтобы уменьшить эту возможность, я считаю, что лучше использовать символы, которые (почти) никогда не встречаются в текстовых файлах Latin-Script, например, шестнадцатеричное значение \ x01 \ x02 или их комбинации, или, возможно, \ xe188b4 языковой стандарт UTF-8 (ሴ - ЭТИОПИЧЕСКИЙ СЛОВАРЬ СМ.)echo -e 'Z' |sed 's/./\xe1\x88\xb4/'
=>ሴ
когда языковой стандарт UTF-8 ..