Perl или sed: Regex заменить групповым захватом - PullRequest
1 голос
/ 27 мая 2020

Кажется, я не могу заставить sed заменить регулярное выражение на групповой захват в этом примере:

  • Ввод: «DONE project 1»
  • Желаемый ввод: «проект 1 СДЕЛАНО "

Что я пробовал с sed:

$ echo "DONE project 1" | sed -E 's/^DONE(.*)$/$1 DONE/g'
$1 DONE  # fail! no group capture in `sed`?

Есть ли способ сделать это в Perl?

На самом деле это часть кода AppleScript, используемого DEVONthink [^ 1], и я понял, что sed не может выполнять поиск / замену регулярного выражения с захватом группы.

[^ 1]: сценарий поиска / замены DEVONthink с использованием AppleScript

set transformedName to do shell script "echo " & quoted form of itemName & " | sed -E 's/" & sourcePattern & "/" & destPattern & "/g'"
set name of selectedItem to transformedName

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

sed может легко сделать это, используйте \1, $1 - это синтаксис обратной ссылки Perl:

sed -E 's/^DONE(.*)/\1 DONE/g'

.* соответствует всей строке до конца, поэтому вы не обязательно использовать $ в LHS.

1 голос
/ 28 мая 2020

Версия Perl очень близка к версии sed, потому что Perl украл некоторые из функций sed:

$ perl -pe 's/^DONE(.*)/\1 DONE/'

-p эффективно обертывает while(<>) { ...; print } вокруг ваш аргумент для -e.

Обратите внимание, что флаг /g здесь не имеет особого смысла. Вы собираетесь сопоставить первый DONE и все, что после него. Второго совпадения нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...