Использование grep и xargs, исключая ошибку «неопределенная цитата» - PullRequest
1 голос
/ 14 мая 2009

Я настолько расстроен, что решил, что пришло время задать вопрос.

Я пытаюсь заменить адрес электронной почты на сайте, который жестко запрограммирован в тысячи страниц. Он находится на сервере FreeBSD 6.3.

Вот команда, которую я использую:

grep -R --files-with-match 'Email \ @ domain.com'. | сортировать | uniq | xargs perl -pi -e 's / электронная почта \ @ domain.com / электронная почта \ @ newdomain.com /' * .html

И вот ошибка, которую я продолжаю получать:

xargs: неопределенная цитата

Как ни странно, когда я запускаю эту команду в тестовом случае из 3 файлов (во вложенной структуре), она работает просто отлично. Я гуглял, и большинство решений, кажется, имеют дело с добавлением -print0 после. и -0 после ксаргов. Однако это приводит к другому набору ошибок, которые заставляют меня поверить, что я помещаю вещи в неправильные места.

Заранее спасибо за помощь

Ответы [ 3 ]

3 голосов
/ 14 мая 2009

Пакс правильный. Далее я бы исправил это что-то вроде:

grep -R --files-with-matches 'Email\@domain.com' . -print0 | xargs -0 perl -pi -e 's/Email\@domain.com/Email\@newdomain.com/'

EDIT:

Благодаря kcwu, это полная версия FreeBSD:

grep -R --files-with-matches 'Email\@domain.com' . --null | xargs -0 perl -pi -e 's/Email\@domain.com/Email\@newdomain.com/'

Обратите внимание, что я удалил sort и uniq. --files-without-match задокументировано как «остановка при первом совпадении», поэтому вы не получите дубликаты файлов. -print0 и -0 обеспечивают (и обрабатывают) список файлов с нулевым символом в конце, что жизненно важно, потому что POSIX позволяет именам файлов содержать символы новой строки.

Обратите внимание, что я не знаю Perl, но я предполагаю, что эта часть примерно эквивалентна:

sed -i s/Email\@domain.com/Email\@newdomain.com/g
1 голос
/ 14 мая 2009

Почему вы предоставляете список файлов HTML для xargs? Эта программа берет свой список файлов из конвейера (вывод grep).

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

Использовать GNU Parallel:

grep -R --files-with-matches 'Email\@domain.com' . | sort | uniq | parallel -q perl -pi -e 's/Email\@domain.com/Email\@newdomain.com/g'

Посмотрите вступительное видео, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

...