Как использовать выражение регулярного выражения (используя sed) в Windows, используя Cygwin, не удаляя возврат каретки? - PullRequest
1 голос
/ 22 февраля 2012

В настоящее время я использую Cygwin в Windows.Если я использую sed для поиска и замены, возврат каретки будет удален, так как файлы остаются с unix touch, не имеющим \ r в конце строк.

Это проблема, например, при использовании subversion, так как файл, кажется, полностью изменился, если были удалены строки возврата каретки.

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

sed -i -e "s/SEARCH/REPLACE/g" `grep -rl SEARCH *`

Ответы [ 4 ]

1 голос
/ 24 февраля 2012

В ответ на ваше беспокойство по поводу выполнения более чем одной sed операции за один проход, пожалуйста, учтите следующее:

$ grep -rl SEARCH * | while read MYFILE;
>   do sed -i -e "s/SEARCH/REPLACE/g" $MYFILE; 
>   unix2dos $MYFILE;
> done

Отправляя результаты grep в read, мы создаемпеременная с именем файла, которая содержит цель поиска.После этого вы можете выполнить любое количество операций с одним файлом в одном цикле цикла.

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

1 голос
/ 22 февраля 2012

Следующее делает работу:

 sed -i -e "s/SEARCH/REPLACE/g;s/$/\\r/" `grep -rl SEARCH *`
0 голосов
/ 01 августа 2014

Для меня эта команда сработала хорошо:

 sed -i -e "s/SEARCH/REPLACE/g;s/$/\r/" `grep -rl SEARCH *`
0 голосов
/ 22 февраля 2012

Не используйте cygwin, но используйте собственную коллекцию GnuTools32, которая включает sed.

родные порты Win32 некоторых утилит gnu

Я не уверен, есть ли уже порт Win64, и будет ли это более полезным для некоторых.

Если вы установите их, они не будут частью пути. Если вы сделаете их появившимися в PATH, обратите внимание, что некоторые из них либо не будут видны, потому что они появятся позже в PATH как Windows с конфликтом имен, либо они будут скрывать аналог Windows - что важно для find.

Я бы предложил сначала сохранить программы для Windows, чтобы работающие существующие скрипты работали, но, возможно, переименуйте их (find-> gnufind), чтобы сделать их легко доступными.

Обратите внимание: я не уверен, уважает ли этот sed символ новой строки Windows, но я так думаю - это имеет гораздо больше смысла. Пожалуйста, попробуйте и сообщите.

Под sed вы получаете grep, find, wc, rev, tac и многие другие. :)

...