#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