использование find и sed в Windows 7 для рекурсивного изменения файлов - PullRequest
2 голосов
/ 20 июля 2011

Я пытаюсь использовать find в Windows 7 с GNU sed для рекурсивной замены строки текста в нескольких файлах в нескольких каталогах.Я посмотрел на этот вопрос , но решение PowerShell, похоже, работает только с одним файлом, и я хочу работать со всеми файлами с определенным расширением, рекурсивно из текущего каталога.Я попробовал эту команду:

find "*.mako" -exec sed -i "s:<%inherit file="layout.mako"/>:<%inherit file="../layout.mako"/>:"

Но это дает мне кучу дерьма и не меняет никаких файлов:

---------- EDIT.MAKO

File not found - -EXEC
File not found - SED
File not found - -I
File not found - LAYOUT.MAKO/>:<%INHERIT FILE=../LAYOUT.MAKO/>:

Как я могу это сделать?Кажется, у меня должны быть установлены все необходимые инструменты, без необходимости устанавливать Cygwin или UnixUtils или что-либо еще.

Редактировать: хорошо, работать с GNU find, я все еще могу 'Я не могу заставить найти часть, чтобы работать:

> gfind -iname "*.mako" .
C:\Program Files (x86)\GnuWin32\bin\gfind.exe: paths must precede expression
> gfind . -iname "*.mako"
C:\Program Files (x86)\GnuWin32\bin\gfind.exe: paths must precede expression
> gfind -iname "*.mako" .
C:\Program Files (x86)\GnuWin32\bin\gfind.exe: paths must precede expression

Я изначально не использовал GNU find в Windows 7 из-за этот вопрос .

Редактировать:

Я попробовал следующее, но sed не видит никаких входных файлов таким образом:

> ls -r | grep mako | sed -i 's/file="layout.mako"/file="..\/layout.mako"/'
sed.exe: no input files

Ответы [ 6 ]

3 голосов
/ 20 июля 2011

НАЙТИ из окон находится вместо поиска из GNU.

Итак, переименуйте ваш find.exe (из gnu) в gfind.exe (например) и затем вызовите gfind вместо find, когда вы захотите запустить его.

[править]
gfind . -name "*.mako" (не gfind -iname "*.make" .)
[/ Править]

1 голос
/ 14 марта 2013

В Powershell запишите escape-последовательность с помощью обратных символов

find . -type f -exec grep hello  `{`} `;

Его гораздо проще использовать xargs

find . | xargs grep hello
1 голос
/ 20 июля 2011

Добавление к Marc B / KevinDTimm отвечает: ваш синтаксис поиска неверен.

Это не:

find "*.mako"

но:

find -name "*.mako"

Кроме того, если есть каталоги, которые соответствуют "*.mako", они будут отправлены в sed. Чтобы избежать этого:

find -name "*.mako" -type f

Наконец, я думаю, что вам не хватает '\;' в конце или команды поиска.

1 голос
/ 20 июля 2011

Вы выполняете обычную команду windows 'find', которая имеет совершенно другие аргументы командной строки, чем gnu find.MS find не имеет возможности выполнять программу для каждого совпадения, он просто ищет.

0 голосов
/ 23 июля 2011

За ваш

Редактировать:

Я попробовал следующее, но sed не видит никаких входных файлов таким образом:

ls -г |Греп Мако |sed -i 's / file = "layout.mako" / file = "../ layout.mako" /' sed.exe: нет входных файлов

, которые необходимо использовать xargs для составления списка файлов, переданных в sed, т.е.

ls -r |Греп Мако | xargs sed -i 's \: file = "layout.mako": file = "../ layout.mako":'

Обратите внимание, что для большинства версий sed, вы можете использовать альтернативный символ для идентификации заменяющих строк совпадения / замены (обычно '/').Некоторые seds требуют экранирования этого альтернативного символа, что я и сделал в этом примере.

Надеюсь, это поможет.

0 голосов
/ 22 июля 2011

Я попробовал следующее, но sed не видит никаких входных файлов таким образом:

ls -r | Греп Мако | sed -i 's / file = "layout.mako" / file = "../ layout.mako" /' sed.exe: нет входных файлов

С этим вы теперь сталкиваетесь с псевдонимом PowerShell "ls". Либо назовите «ls.exe», либо перейдите на все PowerShell так:

ls -r | select-string mako -list | select -exp path | sed -i 's/file="layout.mako"/file="..\/layout.mako"/'

Edit:

Обходной путь, если обработка stdin не работает.

ls -r | select-string mako -list | select -exp path | % {sed -i 's/file="layout.mako"/file="..\/layout.mako"/' $_}
...