perl + add rule для perl однострочная команда - PullRequest
0 голосов
/ 09 декабря 2010

Следующий синтаксис Perl заменяет OLD на NEW, но не если цифра существует до или после слова OLD.

 OLD=ABBA1 ; export OLD
 NEW=OBAMA1 ; export NEW

 perl -i -pe 'next if /^ *#/; s/(\b|\D)$ENV{OLD}(\b|\D)/$1$ENV{NEW}$2/g' file

Мой вопрос:

Я также не хочу заменятьСТАРЫЙ с НОВЫМ, если буквы z или AZ существуют до или после СЛОВОГО слова.

Посоветуйте, пожалуйста, как изменить мой синтаксис Perl, чтобы сделать это?

Примеры (из которых старое слово нужно заменить на NEW):

ABBA1R  - not replace
QABBA1  - not replace
ABBA1W  - not replace
@ABBA1  - replace ABBA1 with OBAMA1
ABBA1=  - replace ABBA1 with OBAMA1
ABBA1w  - not replace
4ABBA1  - not replace
ABBA11  - not replace
e  ABBA1  - replace ABBA1 with OBAMA1  (remark between e to ABBA1 I have space)
ABBA1 p   - replace ABBA1 with OBAMA1  (remark between ABBA1 to p I have space)
?ABBA1    - replace ABBA1 with OBAMA1
_ABBA1_   - replace ABBA1 with OBAMA1

1 Ответ

0 голосов
/ 09 декабря 2010

Это работает для меня:

OLD=ABBA1 ; export OLD
NEW=OBAMA1 ; export NEW

perl -pe 'next if /^ *#/;
          s/(\b|[[:^alnum:]])$ENV{OLD}(\b|[[:^alnum:]])/$1$ENV{NEW}$2/g' <<!

ABBA1R  - not replace
QABBA1  - not replace
ABBA1W  - not replace
@ABBA1  - replace
ABBA1=  - replace
ABBA1w  - not replace
4ABBA1  - not replace
ABBA11  - not replace
e  ABBA1  - replace  (remark between e to ABBA1 I have space)
ABBA1 p   - replace   (remark between ABBA1 to p I have space)
?ABBA1    - replace
_ABBA1_   - replace

!

Это сценарий оболочки - я убрал опцию '-i', поскольку нет файла для перезаписи (и я хочу увидеть результат).

Оригинальный скрипт с конструкциями (\b|\D) был странным; часть '\D' (не цифра) позволяет буквенному символу предшествовать совпадению. Изменение для использования только '(\b|[[:^alnum:]])' дважды требует границы слова или не алфавитно-цифрового символа. Граница слова имеет значение в начале или конце строки. Теперь захваты нужны.

Выход

ABBA1R  - not replace
QABBA1  - not replace
ABBA1W  - not replace
@OBAMA1  - replace
OBAMA1=  - replace
ABBA1w  - not replace
4ABBA1  - not replace
ABBA11  - not replace
e  OBAMA1  - replace  (remark between e to OBAMA1 I have space)
OBAMA1 p   - replace   (remark between OBAMA1 to p I have space)
?OBAMA1    - replace
_OBAMA1_   - replace
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...