Я хотел бы запустить поиск и замену файла HTML через командную строку.
Моя команда выглядит примерно так:
sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html > index.html
Когда я запускаю это и смотрю на файл позже, он пуст. Он удалил содержимое моего файла.
Когда я запускаю это после восстановления файла снова:
sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html
stdout
Это содержимое файла, а также поиска и замены была выполнена.
Почему это происходит?
shell
unix
sed
io-redirection
BBales
источник
источник
perl -pi -w -e 's/STRING_TO_REPLACE/REPLACE_WITH/g;' index.html
sed
команд, чтобы найти строку и заменить всю строку: stackoverflow.com/questions/11245144/…Ответы:
Когда оболочка видит
> index.html
в командной строке, она открывает файлindex.html
для записи , стирая все его предыдущее содержимое.Чтобы это исправить, вам нужно передать
-i
параметр, чтобыsed
сделать изменения встроенными и создать резервную копию исходного файла, прежде чем он внесет изменения на месте:Без .bak команда не будет работать на некоторых платформах, таких как Mac OSX.
источник
truncates the file
а не,opens the file
вероятно, делает это яснее.sed -i '' 's/blah/xx/g'
.bak
послеsed -i
?Альтернативный, полезный шаблон:
Это имеет почти тот же эффект, без использования этой
-i
опции, и дополнительно означает, что, если сценарий sed завершается ошибкой по какой-то причине, входной файл не засоряется. Кроме того, если редактирование прошло успешно, резервной копии не осталось. Этот вид идиомы может быть полезен в Makefiles.Довольно много у seds есть
-i
выбор, но не все из них; posix sed - это тот, который не делает. Поэтому, если вы стремитесь к мобильности, этого лучше избегать.источник
... && mv index.html{.tmp,}
sh
(если я правильно помню) этого{...}
расширения нет. В Makefile вы можете использовать,sh
а неbash
, поэтому, если вы стремитесь к переносимости (или posixness), то вам нужно избегать этой конструкции.Это делает глобальную замену на месте в файле index.html. Кавычка строки предотвращает проблемы с пробелами в запросе и замене.
источник
используйте опцию sed -i, например
источник
's/STRING_TO_REPLACE/REPLACE_WITH/g'
-i
выполняет редактирование файлов на месте , поэтому нет смысла комбинировать его с вводом stdin .Чтобы изменить несколько файлов (и сохранить резервную копию каждого как * .bak):
будет принимать все файлы в каталоге и заменить
|
сx
этим называется «Perl пирог» (легко , как пирог)источник
sed
в качестве требования, он использовался только в качестве уже опробованного инструмента.Вы должны попробовать использовать опцию
-i
для редактирования на месте.источник
Если у вас есть ссылка для добавления, попробуйте это. Найдите URL-адрес, как указано выше (начиная с https и заканчивая здесь ..com), и замените его строкой URL-адреса. Я использовал переменную
$pub_url
здесь.s
здесь означает поиск иg
означает глобальную замену.Оно работает !
источник
Предупреждение: это опасный метод! Он использует буферы ввода / вывода в linux и с определенными параметрами буферизации ему удается работать с небольшими файлами. Это интересное любопытство. Но не используйте это для реальной ситуации!
Кроме
-i
того,sed
вы можете использоватьtee
утилиту .От
man
:Итак, решение будет таким:
- здесь
tee
повторяется, чтобы убедиться, что конвейер буферизован. Затем все команды в конвейере блокируются, пока они не получат некоторый ввод для работы. Каждая команда в конвейере запускается, когда вышестоящие команды записывают 1 буфер байтов (размер где-то определен ) на вход команды. Таким образом, последняя командаtee index.html
, которая открывает файл для записи и, следовательно, очищает его, выполняется после завершения восходящего конвейера и вывода в буфер внутри конвейера.Скорее всего, следующее не будет работать:
- он будет запускать обе команды конвейера одновременно без какой-либо блокировки. (Без блокировки трубопровода должны пройти байты построчно вместо буфера буфера. То же, что при запуске
cat | sed s/bar/GGG/
. Без блокировки это более интерактивные и , как правило трубопроводы всего 2 команд работают без буферизации и блокировки. Более длинные трубопроводы буферные.) Вtee index.html
воле откройте файл для записи, и он будет очищен. Однако, если вы включите буферизацию всегда, вторая версия тоже будет работать.источник
>
, но точка зрения состоит в том, что это неверное решение, которое может привести к потере данных).Проблема с командой
в том
file
, что оболочка усекается до того, как sed действительно его обработает. В результате вы получите пустой файл.SED способ сделать это, чтобы использовать
-i
для редактирования на месте, как предложили другие ответы. Однако это не всегда то, что вы хотите.-i
создаст временный файл, который затем будет использован для замены исходного файла. Это проблематично, если в вашем исходном файле была ссылка (ссылка будет заменена обычным файлом). Если вам нужно сохранить ссылки, вы можете использовать временную переменную для хранения вывода sed перед записью его обратно в файл, например так:Еще лучше использовать
printf
вместо,echo
такecho
как, вероятно, будет обрабатываться\\
как\
в некоторых оболочках (например, тире):источник
sed 'code' file > file.tmp; cat file.tmp > file; rm file.tmp
И
ed
ответ:Чтобы повторить ответ codaddict , оболочка сначала обрабатывает перенаправление , стирая файл «input.html», а затем оболочка вызывает команду «sed», передавая ей теперь пустой файл.
источник
ed
версию»sed
ответов? это работает быстрее?sed
не реализуют-i
для редактирования на месте.ed
вездесущ и позволяет вам сохранить ваши изменения в исходном файле. Плюс всегда хорошо иметь много инструментов в своем наборе.Вы можете использовать Vim в режиме Ex:
%
выбрать все строкиx
сохранить и закрытьисточник
Я искал вариант, где я могу определить диапазон строк и нашел ответ. Например, я хочу изменить host1 на host2 из строки 36-57.
Вы также можете использовать опцию gi, чтобы игнорировать регистр символов.
источник
При всем уважении к правильным ответам, приведенным выше, всегда полезно запускать такие сценарии «пробного запуска», чтобы вы не повредили файл и не начали заново.
Просто заставьте ваш скрипт выводить вывод в командную строку, а не записывать его в файл, например, так:
ИЛИ
Таким образом, вы можете увидеть и проверить вывод команды без усечения файла.
источник