sed — поиск и замена всегда помещают группу захвата в конец

#sed #xargs #ag

#sed #xargs #ag

Вопрос:

Я занимаюсь рефакторингом некоторого кода во множестве файлов и пытаюсь выполнить поиск и замену с помощью 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

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

Ответ №1:

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

Если у вас есть 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
  

Ответ №2:

если ваши данные в файле ‘d’, по gnu sed,

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