Відповіді:
OS X використовує поєднання інструментів BSD та GNU, тому краще завжди перевірити документацію (хоча я мав її, яка less
не відповідала навіть маніпуляції OS X):
sed приймає аргумент after -i
як розширення для резервного копіювання. Надайте порожній рядок ( -i ''
) для резервного копіювання.
Слід зробити наступне:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
Це -type f
просто хороша практика; sed поскаржиться, якщо ви дасте йому каталог чи так.
-exec
є кращим xargs
; вам не потрібно ні з -print0
чим, ні з чим. В {} +
кінці означає, що find
додасть усі результати як аргументи до одного екземпляра викликаної команди, замість того, щоб повторно запускати її для кожного результату. (Один виняток - коли максимальна кількість аргументів командного рядка, дозволених ОС, порушено; у такому випадку find
буде запущено більше одного екземпляра.)
%
символ: sed "s%localhost/site%blah/blah%"
. Іншою альтернативою є зворотною косою риси уникнути роздільник: sed "s/localhost\/site/blah\/blah/"
.
illegal byte sequence
помилку? якщо так, спробуйте:, LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
це працювало на мене.
/g
для декількох LC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
Для mac більш подібний підхід був би таким:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
Як альтернативне рішення, я використовую це на Mac OSX 10.7.5
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
Кредит стосується: відповіді Тодда Сезера
Жоден із перерахованих вище не працює на OSX.
Зробіть наступне:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
Версія, яка працює як на Linux, так і на Mac OS X (додавши -e
перемикач до sed
):
export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'
export LC_CTYPE=C && export LANG=C
Кожного разу, коли я ввожу цю команду, я, здається, завжди всмоктую її або забуваю прапор. Я створив Gist on github на основі відповіді TaylanUB, який замінює глобальну знахідку з поточного каталогу. Це специфічно для Mac OSX.
https://gist.github.com/nateflink/9056302
Це добре, тому що зараз я просто відкриваю термінал, а потім копіюю:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "substitu-a-url.com"
Ви можете отримати деякі дивні помилки послідовності байтів, тому ось повний код:
#!/bin/bash
#By Nate Flink
#Invoke on the terminal like this
#curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: ./$0 [find string] [replace string]"
exit 1
fi
FIND=$1
REPLACE=$2
#needed for byte sequence error in ascii to utf conversion on OSX
export LC_CTYPE=C;
export LANG=C;
#sed -i "" is needed by the osx version of sed (instead of sed -i)
find . -type f -exec sed -i "" "s|${FIND}|${REPLACE}|g" {} +
exit 0
Якщо ви використовуєте zsh-термінал, ви можете використовувати магію підстановки:
sed -i "" "s/search/high-replace/g" *.txt
Я використовував цей формат - але ... я виявив, що мені довелося запустити його три і більше разів, щоб змусити його фактично змінити кожен екземпляр, який мені здався надзвичайно дивним. Якщо запустити один раз, це змінило б деякі файли, але не всі. Виконання точно однієї і тієї ж струни два-чотири рази охопило б усі екземпляри.
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
g
в кінці, інакше він замінює лише перше виникнення thistext
у рядку. Тож ваш регекс має бутиs/thistext/newtext/g
https://bitbucket.org/masonicboom/serp - це утиліта go (тобто крос-платформа), протестована на OSX, яка виконує рекурсивний пошук-заміна тексту у файлах у заданому каталозі та підтверджує кожну заміну. Це нове, тому може бути баггі.
Використання виглядає так:
$ ls test
a d d2 z
$ cat test/z
hi
$ ./serp --root test --search hi --replace bye --pattern "*"
test/z: replace hi with bye? (y/[n]) y
$ cat test/z
bye
find . -type f | xargs sed -i '' 's/string1/string2/g'
Зверніться сюди для отримання додаткової інформації.
Команда на OSX повинна бути точно такою ж, як і Unix під симпатичним інтерфейсом.
-print0
додати до find
прапорів і -0
до xargs
прапорів.
-exec sed -i s/this/that/g {} \+
замість -print
і xargs
xargs
може бачити пробіл "./jacobus" як файл для передачі sed
, а потім з "R.txt" , жоден з яких не існує.
може просто сказати $ PWD замість "."
apple.stackexchange.com
оскільки це недостатньо загально для Linux та всіх розробників.