Я успешно использовал следующую sed
команду для поиска / замены текста в Linux:
sed -i 's/old_link/new_link/g' *
Однако, когда я пробую это на моем Mac OS X, я получаю:
"команда c ожидает \ сопровождается текстом"
Я думал, что мой Mac работает с нормальной оболочкой BASH. Что происходит?
РЕДАКТИРОВАТЬ:
Согласно @High Performance, это связано с тем, что Mac sed
отличается (BSD), поэтому мой вопрос будет таким: как мне повторить эту команду в BSD sed
?
РЕДАКТИРОВАТЬ:
Вот фактический пример, который вызывает это:
sed -i 's/hello/gbye/g' *
sed
видит «c» в ваших данных как команду. Вы используете переменную? Пожалуйста, опубликуйте что-то, что более точно отражает фактическую команду и некоторые данные, которые вы обрабатываете. Вы можете получить простую демонстрацию этой ошибки, выполнивecho x | sed c
.Ответы:
Если вы используете эту
-i
опцию, вам нужно предоставить расширение для ваших резервных копий.Если у вас есть:
Команда (обратите внимание на отсутствие места между
-i
и''
и,-e
чтобы заставить его работать на новых версиях Mac и на GNU):Создайте 2 резервных файла, например:
Не существует портативного способа избежать создания файлов резервных копий, поскольку невозможно найти сочетание команд sed, которое работает во всех случаях:
sed -i -e ...
- не работает на OS X, поскольку создает-e
резервные копииsed -i'' -e ...
- не работает на OS X 10.6, но работает на 10.9+sed -i '' -e ...
- не работает на GNUПримечание. Поскольку команда sed не работает на всех платформах, вы можете попробовать использовать другую команду для достижения того же результата.
Например,
perl -i -pe's/old_link/new_link/g' *
источник
sed
могу судить, вы поставили резервный суффикс. Суффикс резервной копии естьs/old_link/new_link/g
. Следующим аргументом после этого должны быть команды редактирования. Поскольку он интерпретировал команды как имя резервной копии, он взял первое имя файла в качестве команд редактирования, но они не были действительными.sed -i '' -e ...
?sed -i'' -e
Кажется, не работаетЯ считаю , что в OS X при использовании -i расширение для файлов резервного копирования требуется . Пытаться:
Использование GNU
sed
расширение не является обязательным .источник
Это работает как с GNU, так и с BSD версиями sed:
или с резервной копией:
Обратите внимание, пропущено место после
-i
опции! (Необходимо для GNU sed)источник
rm
команду сразу после удаления.sed -i'' ...
=>sed -i '' ...
Была такая же проблема в Mac и решена с помощью
brew
:и использовать как
Вы также можете установить в
sed
качестве псевдонимаgsed
(если хотите):источник
Или вы можете установить GNU-версию sed на вашем Mac под названием gsed и использовать ее, используя стандартный синтаксис Linux.
Для этого установите
gsed
порты (если у вас их нет, получите их по адресу http://www.macports.org/ ), запустивsudo port install gsed
. Затем вы можете запуститьsed -i 's/old_link/new_link/g' *
источник
gnu-sed
Ваш Mac действительно запускает оболочку BASH, но это больше вопрос того, с какой реализацией sed вы имеете дело. На Mac Sed происходит из BSD и немного отличается от Sed, который вы можете найти на типичной Linux-системе. Я предлагаю вам
man sed
.источник
Ответ Синетриса правильный, но я использую это с
find
командой, чтобы быть более точным в том, какие файлы я хочу изменить. В целом это должно работать (проверено на OSX/bin/bash
):Вообще при использовании
sed
безfind
в сложных проектах менее эффективно.источник
-exec
это очень мило! Мне просто интересно, нужен ли в конце слеш\
,;
интерпретируемая оболочкой оболочка, когда я пробовал такоеЯ создал функцию для обработки
sed
различий между MacOS (протестировано на MacOS 10.12) и другими ОС:Использование:
Куда:
,
это разделитель's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"','
это шаблон"./mysql/.env"
путь к файлуисточник
Вот как применить переменные окружения к файлу шаблона (нет необходимости в резервном копировании).
1. Создайте шаблон с {{FOO}} для последующей замены.
2. Замените {{FOO}} переменной FOO и выведите ее в новый файл foo.conf
Работает как MacOS 10.12.4, так и Ubuntu 14.04.5.
источник
Как показывают другие ответы, не существует способа использовать sed для переноса в OS X и Linux без создания резервных файлов. Итак, я вместо этого использовал этот однострочный Ruby:
В моем случае мне нужно было вызвать его из
rake
задачи (т. Е. Из сценария Ruby), поэтому я использовал этот дополнительный уровень цитирования:источник
Работает как на BSD, так и на Linux
источник
e
добавленным