Какой самый простой способ найти и заменить данную входную строку, скажем abc
, и заменить другой строкой, скажем, XYZ
в файле /tmp/file.txt
?
Я пишу приложение и использую IronPython для выполнения команд через SSH - но я не очень хорошо знаю Unix и не знаю, что искать.
Я слышал, что Bash, помимо интерфейса командной строки, может быть очень мощным языком сценариев. Итак, если это правда, я предполагаю, что вы можете выполнять такие действия.
Могу ли я сделать это с помощью bash, и какой самый простой (однострочный) скрипт для достижения моей цели?
sed
:s/..../..../ - Substitute
and/g - Global
invalid command code C
об ошибке ... Для замены на месте BSDsed
требует расширения файла после-i
флага, поскольку оно сохраняет файл резервной копии с указанным расширением. Например:sed -i '.bak' 's/find/replace/' /file.txt
вы можете пропустить резервное копирование, используя пустую строку, например так:sed -i '' 's/find/replace/' /file.txt
s/abc/XYZ/gi
Манипулирование файлами обычно не выполняется Bash, а программами, вызываемыми Bash, например:
-i
Флаг указывает ему сделать замену на месте.Более
man perlrun
подробную информацию смотрите, в том числе о том, как сделать резервную копию исходного файла.источник
perl -pi -e 's/chdir (?:\\/[\\w\\.\\-]+)+/chdir blah/g' text
, но продолжаю получать сообщение об ошибке. Отсутствие пробела между шаблоном и следующим словом устарело в строке -e 1. Не соответствует (в регулярном выражении; помечено <- HERE в m / (chdir) () (<- HERE ?: \\ / at -e строка 1.Я был удивлен, когда наткнулся на это ...
Есть
replace
команда, которая поставляется с"mysql-server"
пакетом, поэтому, если вы установили его, попробуйте:Смотрите
man replace
больше об этом.источник
replace
полезный независимый инструмент, и люди MySQL должны выпускать его отдельно и зависеть от него; б)replace
требует немного MySQL o_O. В любом случае, установка mysql-сервера для замены будет неправильным решением. :)mysql-server
пакет. Как указано @rayro,replace
является частью этого.Это старый пост, но для тех, кто хочет использовать переменные, как @centurian сказал, что одинарные кавычки означают, что ничего не будет расширено.
Простой способ получить переменные - это выполнить конкатенацию строк, так как это делается с помощью сопоставления в bash: должно работать следующее:
источник
Bash, как и другие оболочки, является просто инструментом для координации других команд. Обычно вы пытаетесь использовать стандартные команды UNIX, но вы, конечно, можете использовать Bash для вызова чего угодно, включая ваши собственные скомпилированные программы, другие сценарии оболочки, сценарии Python и Perl и т. Д.
В этом случае есть несколько способов сделать это.
Если вы хотите прочитать файл и записать его в другой файл, выполняя поиск / замену, используйте sed:
Если вы хотите отредактировать файл на месте (как будто открываете файл в редакторе, редактируете его, затем сохраняете), предоставьте инструкции редактору строк 'ex'
Ex похож на vi без полноэкранного режима. Вы можете дать ему те же команды, что и в приглашении vi ':'.
источник
Я нашел эту ветку среди других, и я согласен, что она содержит наиболее полные ответы, поэтому я тоже добавляю свою:
sed
иed
так полезны ... вручную. Посмотрите на этот код от @Johnny:Когда мое ограничение заключается в том, чтобы использовать его в сценарии оболочки, никакая переменная не может использоваться внутри вместо «abc» или «XYZ». BashFAQ , кажется, согласны с тем, что я понимаю , по крайней мере. Итак, я не могу использовать:
Но что мы можем сделать? Как сказал @Johnny, используйте,
while read...
но, к сожалению, это не конец истории. Следующие хорошо работали со мной:Как можно видеть, если
nullglob
установлено тогда, это ведет себя странно, когда есть строка, содержащая*
как в:который становится
нет конечной угловой скобки, и Apache2 не может даже загрузить.
Этот вид синтаксического анализа должен быть медленнее, чем поиск и замена одним нажатием, но, как вы уже видели, есть четыре переменные для четырех различных шаблонов поиска, работающих в одном цикле анализа.
Наиболее подходящее решение, которое я могу придумать с учетом предположений о проблеме.
источник
sed -e "s/$x/$y/"
, и это сработает. Не двойные кавычки. Это может серьезно сбить с толку, если строки в самих переменных содержат символы со специальным значением. Например, если x = "/" или x = "\". Когда вы сталкиваетесь с этими проблемами, это, вероятно, означает, что вы должны прекратить попытки использовать оболочку для этой работы.Вы можете использовать
sed
:Используйте
-i
для «игнорировать регистр», если вы не уверены, что текст для поиска являетсяabc
илиABC
или или иAbC
т. Д.Вы можете использовать
find
и,sed
если вы не знаете свое имя файла:Найти и заменить во всех файлах Python:
источник
Вы также можете использовать
ed
команду для поиска в файле и замены:Подробнее см. В разделе « Редактирование файлов с помощью сценариев с помощью
ed
».источник
sed -i <pattern> <filename>
). Очень хорошо!Если файл, над которым вы работаете, не такой большой, и временное сохранение его в переменной не представляет проблемы, тогда вы можете использовать подстановку строк Bash для всего файла сразу - нет необходимости просматривать его построчно:
Все содержимое файла будет обрабатываться как одна длинная строка, включая разрывы строк.
Например
$replacement
, XYZ может быть переменной , и одним из преимуществ не использования sed здесь является то, что вам не нужно беспокоиться о том, что строка поиска или замены может содержать символ разделителя шаблона sed (обычно, но не обязательно, /). Недостатком является невозможность использования регулярных выражений или каких-либо более сложных операций sed.источник
Будьте осторожны, если вы заменяете URL-адреса символом "/".
Пример того, как это сделать:
Извлечено из: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
источник
Попробуйте следующую команду оболочки:
источник
sed
, используйтеsed -i''
вместо этого.Чтобы редактировать текст в файле неинтерактивно, вам нужен текстовый редактор на месте, например, vim.
Вот простой пример, как использовать его из командной строки:
Это эквивалентно @slim ответ на экс редактора , который является в основном то же самое.
Вот несколько
ex
практических примеров.Замена текста
foo
сbar
в файле:Удаление конечных пробелов для нескольких файлов:
Устранение неисправностей (когда терминал застрял):
-V1
параметр, чтобы показать подробные сообщения.-cwq!
.Смотрите также:
источник
-V1
, принудительного выхода используйтеwq!
.Вы также можете использовать python в скрипте bash. У меня не было большого успеха с некоторыми из лучших ответов здесь, и я обнаружил, что это работает без необходимости циклов:
источник
Вы можете использовать команду rpl. Например, вы хотите изменить доменное имя во всем проекте php.
Это не совсем понятно, но это очень быстро и полезно. :)
источник