sed - Поиск и замена всегда ставят группу захвата в конец - PullRequest
1 голос
/ 12 апреля 2019

Я выполняю рефакторинг некоторого кода в большом количестве файлов и пытаюсь выполнить поиск и замену, используя sed на Mac.

Цель состоит в том, чтобы пойти из этого:

fooActions: typeof fooActionCreators

к этому:

fooActions: Partial<typeof fooActionCreators>

Я понял, что он работает в основном с помощью выражения sed:

ag -l "Actions: typeof " | xargs sed -i "" -e "s/Actions: typeof \(\w*\)/Actions: Partial<typeof \1>/g"

В основном, используя ag, чтобы найти список имен файлов, содержащих совпадающую строку, затем используйте xargs, чтобы передать их в качестве ввода в мое sed выражение.

Вывод, который я получаю, выглядит так: fooActions: Partial<typeof >fooActionCreators

Я не могу понять, почему моя группа захвата размещается в конце, а не там, где она у меня есть в предложении замены.

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

sed, который поставляется с mac, не поддерживает \w для символов слова.

Если у вас есть gsed (gnu sed), это должно работать как положено.

$ echo 'Actions: typeof foo' |  gsed  -e "s/Actions: typeof \(\w*\)/Actions: Partial<typeof \1>/g"
Actions: Partial<typeof foo>

В противном случае вы можете использовать что-то вроде [a-zA-Z]* вместо \w*.

$ echo 'Actions: typeof foo' |  sed  -e "s/Actions: typeof \([a-zA-Z]*\)/Actions: Partial<typeof \1>/g"
Actions: Partial<typeof foo>

На первый взгляд странное поведение, которое вы видите, заключается в том, что в простой версии sed, \w* соответствует пустой строке перед тем, что вы хотите сопоставить, как показано ниже:

Обычный sed соответствует пустой строке перед a

$ echo a | sed "s/\(\w*\)/\1x/"
xa

Gnu sed соответствует a, как и предполагалось

$ echo a | gsed "s/\(\w*\)/\1x/"
ax
0 голосов
/ 12 апреля 2019

если ваши данные в файле 'd', от gnu sed,

sed -E 's/^(fooAction)s: (typeof \1Creators)/\1s: Partial<\2>/' d
...