2013-11-01 3 views
3

Объявление о банкротстве через час, пытаясь решить эту проблему. Возникает вопрос:Заменить строку пробелами рекурсивно с помощью sed на Mac

У меня есть папка с 15 000 файлами (Magento). Я хочу изменить все даты авторских прав с 2013 по 2012 год, чтобы я мог получить законную разницу между выпусками. Я пытаюсь использовать СЭД, основываясь на этом примере: https://stackoverflow.com/a/1583282

Эта команда работает:

cd path/to/project 
find . -type f -print0 | xargs -0 sed -i '' 's/2013/2012/g' 

Кроме этого, я, очевидно, не может верить, что 2013 относится только к датам. Полная строка в DocBlocks Magento является:

* @copyright Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com) 

Я пытаюсь переписать SED выражение для использования «(с) 2013 Magento» в строке, но я получаю сообщение об ошибке:

sed: RE error: illegal byte sequence 

Очевидно, что что-то нужно избегать, но я не могу найти подходящих примеров. Я вовсе не волшебник-баш.

Каков правильный формат для этого сегмента выражения?

's/(c) 2013 Magento/(c) 2012 Magento/g' 
+0

Возможная альтернатива: https://gist.github.com/kalenjordan/6766591 –

+0

Имеет ли ваш файл буквально «(c)» или ©? –

+0

Возможный дубликат: http://stackoverflow.com/q/11287564/1126841 – chepner

ответ

0

Попробуйте СЭД:

sed 's/\(©\) 2013 \(Magento\)/\1 2012 \2/g' 
+0

Не работал для меня. –

+0

Можете ли вы попробовать: ** 'sed 's/2013. * \ (Magento \)/2012 \ 1/g'' ** – anubhava

+0

По-прежнему получать: sed: ошибка RE: незаконная последовательность байтов –

0

find /full/path/to/magento -type f -print0 | xargs -0 sed -i '' 's/(c) 2013 Magento/(c) 2012 Magento/g'

Однако:

grep -lir -e '2013 Magento' /full/path/to/magento /full/path/to/magento/app/code/core/Enterprise/Enterprise/etc/config.xml /full/path/to/magento/app/code/core/Mage/Page/etc/config.xml /full/path/to/magento/app/locale/en_US/Mage_Page.csv /full/path/to/magento/errors/default/page.phtml /full/path/to/magento/errors/enterprise/page.phtml /full/path/to/magento/downloader/template/footer.phtml /full/path/to/magento/downloader/template/install/footer.phtml

Эти файлы будут по-прежнему есть "& копия; 2013 Magento", размещенные в файлах

Это должно K:

find /full/path/to/magento -type f -print0 | xargs -0 sed -i '' 's/2013 Magento/2012 Magento/g'

+0

Нет. Получение этой ошибки: sed: 1: "./.!14184!.DS_Store": неверный код команды. –

+0

Из этой команды: find. -тип f -print0 | xargs -0 sed -i 's/2013 Magento/2012 Magento/g' –

+0

Извините .. «на Mac» Отредактировал свой ответ. – Richu

0

Просто спасаясь круглые скобки, кажется, работает для меня:

$ sed 's/\(c\) 2013 Magento/\(c\) 2012 Magento/g' <<< "@copyright Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com)" 
@copyright Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com) 
3

Obviously, something needs to be escaped but I can't find any applicable examples. I am not a bash-wizard by any means

Независимо от рода мастера вы, вы послали стека Переполнение карликов в Лихолесья. Ваша проблема - не экранирование команды. Следующие будут работать нормально.

find . -type f -print0 | xargs -0 sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g' 

Проверьте это, запустив его в пустой каталог.

$ mkdir tmp-gandalf 
$ cd tmp-gandalf 
$ find . -type f -print0 | xargs -0 sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g' 

Если у вас была проблема с экранированием оболочки, ваша система будет жаловаться на это здесь.

В этом проблема. Первая часть вашей команды находит все файлы для работы на

find . -type f -print0 

Использование -type f находит все файлы. Включая нетекстовые файлы. Команда sed не любит нетекстовые файлы.Попробуйте что-то вроде этого

sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g' /path/to/some.gif 
find . -name '*.php' -o -name '*.xml' -o -name '*.phtml' 

Где /path/to/some.gif двоичный файл. Вы увидите ошибку sed: RE error: illegal byte sequence. Это sed «wtf, я не такой неуклюжий или случайный, как бластер. Я пришел из более цивилизованного возраста, где все было ASCII».

Этот вопрос Stack Overflow имеет слегка взломанную работу (смещение атрибута LANG). Я не знаю достаточно, чтобы доверять, если это хорошая идея или нет.

Моим личным подходом было бы ограничить ваш find таким, чтобы были включены только файлы с определенными расширениями. Вы можете указать несколько шаблонов имен с опцией -o. Так что-то вроде этого

//NOTE: each -o needs its own -print0 
find . -name '*.php' -print0 -o -name '*.xml' -print0 -o -name '*.phtml' -print0 | xargs -0 sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g' 

поиска Будет .php, .xml и .phtml файлов. Вы можете добавить js файлов с другим -o -name '*.js'. В базе кода Magento должно быть только несколько типов файлов с уведомлениями об авторских правах.

+0

Проблема двоичного файла имеет смысл, и спасибо за использование правильной фразы LOTR/SW, чтобы я понял. Выполнение последней команды с несколькими параметрами имени выполняется, но замена не записывается в файлы. Я понимаю, что это означает, что «sed -i» param должен делать, но, похоже, это не оказывает такого эффекта. Я также попытался добавить {} в конец (я думаю, что это перетаскивает список файлов из команды «find» в «sed», но это не повлияло. Любые идеи? –

+0

Я уверен, что вам нужно добавить -e, чтобы ваш команда будет выглядеть примерно так: find -name "* .xml" -type f -exec sed -i -e 's/RegEx/Replacement/g' {} \; – peekay

Смежные вопросы