Linux sed перезаписать файл

Linux sed перезаписать файл

Друзья!
Подскажите элегантное решение: прочитать файл, заменить sed-ом часть информации и записать в тот же файл. В одну строку.
А то корявая конструкция получается: прочитать, заменить, записать в промежуточный файл, заменить исходный.
Заранее благодарю!

Ответить | Правка | Cообщить модератору

Оглавление

  • sed и запись изменений в тот же файл, Andrey Mitrofanov, 23:01 , 13-Авг-13, (1)
    • sed и запись изменений в тот же файл, Alting, 23:09 , 13-Авг-13, (2)

Сообщения по теме [Сортировка по времени | RSS]

Поищи в man sed ключ -i. Если есть, ты выиграл Приз!

1. «sed и запись изменений в тот же файл» + / –
Сообщение от Andrey Mitrofanov on 13-Авг-13, 23:01
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. «sed и запись изменений в тот же файл» + / –
Сообщение от Alting (ok) on 13-Авг-13, 23:09

>> в тот же файл. В одну строку.
> Поищи в man sed ключ -i. Если есть, ты выиграл Приз!

Йес! Я выиграл приз 🙂
Вот уж не обращал внимания на этот ключ.
Главное, что он присутствует busybox-овском sed-е.
Спасибо!

Источник

sed: изменить файл и сохранить.

Глупый вопрос, но все же. Есть файл(ы), в них надо поменять третью строчку, предположим с hello на bye. Разумеется, файл надо сохранить. Когда я делаю это седом и сохраняю вывод в этом же файл, он получается пустым. Если вывод делать в несуществующий файл — все нормально. Видать, запись самого в себя как-то неправильно происходит. Как мне быть?

Re: sed: изменить файл и сохранить.

сохранить седовский вывод во временный фаил

Re: sed: изменить файл и сохранить.

Товарищ анонимус, прочтите уже ёлы-палы если не доку по sed’у, то хотя бы ман! Сколько можно?

Re: sed: изменить файл и сохранить.

Мдыыыы не все в порядке в королевстве датском. что-то на ЛОРе очередное обострение все хотят sed. колитесь мужики кто рекламировал sed ?

Re: sed: изменить файл и сохранить.

>Мдыыыы не все в порядке в королевстве датском. что-то на ЛОРе >очередное обострение все хотят sed. колитесь мужики кто рекламировал >sed ? У тебя есть продукт собственного изготовления, в котором есть хорошая документация, поддержка, и функции реализованы намного удобнее и больше. Урл, плиз. PS. Умники.

Re: sed: изменить файл и сохранить.

Увы-увы люди преуспели в искусстве унижения, но так и не научились читать.

Источник

Найти и заменить текст в файле с помощью команд

Как я могу найти и заменить определенные слова в текстовом файле, используя командную строку?

  • sed = Stream EDitor
  • -i = на месте (т.е. сохранить обратно в исходный файл)
  • s = команда замены
  • original = регулярное выражение, описывающее слово для замены (или только само слово)
  • new = текст для замены
  • g = глобальный (т.е. заменить все, а не только первое вхождение)

file.txt = имя файла

Есть несколько разных способов сделать это. Один использует sed и Regex. SED — это потоковый редактор для фильтрации и преобразования текста. Один пример выглядит следующим образом:

Другой способ , который может иметь больше смысла , чем и > strout является с трубами!

Есть множество способов достичь этого. В зависимости от сложности того, чего можно достичь с помощью замены строки, и в зависимости от инструментов, с которыми пользователь знаком, некоторые методы могут быть предпочтительнее других.

В этом ответе я использую простой input.txt файл, который вы можете использовать для проверки всех примеров, представленных здесь. Содержимое файла:

Bash на самом деле не предназначен для обработки текста, но простые замены могут быть выполнены с помощью расширения параметров , в частности, здесь мы можем использовать простую структуру $ .

Этот небольшой скрипт не выполняет замену на месте, это означает, что вам придется сохранить новый текст в новый файл и избавиться от старого файла, или mv new.txt old.txt

Примечание: если вам интересно, почему while IFS= read -r ; do . done он используется, то в основном это способ чтения файла строка за строкой. Смотрите это для справки.

AWK, будучи утилитой обработки текста, вполне подходит для такой задачи. Он может делать простые замены и намного более сложные, основанные на регулярных выражениях . Он обеспечивает две функции: sub() и gsub() . Первый из них заменяет только первое вхождение, а второй — заменяет вхождения во всей строке. Например, если у нас есть строка one potato two potato , это будет результат:

AWK может принять входной файл в качестве аргумента, поэтому input.txt было бы легко сделать то же самое с :

В зависимости от версии AWK, которая у вас есть, она может иметь или не иметь редактирование на месте, поэтому обычная практика — сохранять и заменять новый текст. Например что-то вроде этого:

Sed — это редактор строк. Он также использует регулярные выражения, но для простых замен достаточно сделать:

Что хорошо в этом инструменте, так это то, что он имеет редактирование на месте, которое вы можете включить с -i флагом.

Perl — это еще один инструмент, который часто используется для обработки текста, но это язык общего назначения, который используется в сетях, системном администрировании, настольных приложениях и во многих других местах. Он заимствовал много концепций / функций из других языков, таких как C, sed, awk и другие. Простую замену можно сделать так:

Как и у sed, у perl также есть флаг -i.

питон

Этот язык очень универсален и также используется в самых разных приложениях. Он имеет много функций для работы со строками, среди которых есть replace() , так что если у вас есть переменная, как var=»Hello World» , вы могли бы сделать var.replace(«Hello»,»Good Morning»)

Простой способ прочитать файл и заменить строку в нем будет так:

Однако в Python вам также нужно выводить в новый файл, что вы также можете сделать из самого скрипта. Например, вот простой:

Источник

Sed редактировать файл на месте

Я пытаюсь выяснить, возможно ли отредактировать файл в одной команде sed без вручную потокового редактирования отредактированного содержимого в новый файл, а затем переименовать новый файл в исходное имя файла, Я попробовал параметр -i , но моя система Solaris сообщила, что -i является незаконным вариантом. Есть ли другой способ?

Опция -i передает измененный контент в новый файл, а затем переименовывает его за кулисами.

В системе, где sed не имеет возможности редактировать файлы на месте, я думаю, что лучшим решением было бы использовать perl :

Хотя это и создает временный файл, он заменяет оригинал, потому что был добавлен суффикс/расширение пустого места.

Обратите внимание, что на OS X вы можете получить странные ошибки, такие как “недопустимый код команды” или другие странные ошибки при выполнении этой команды. Чтобы исправить эту проблему, попробуйте

Это связано с тем, что в версии OSX sed параметр -i ожидает аргумент extension , поэтому ваша команда фактически анализируется как аргумент extension , а путь к файлу интерпретируется как код команды. Источник: qaru.site/questions/33995/…

Следующее работает отлично на моем mac

Мы заменяем foo на bar в файле образца. Резервное копирование исходного файла будет сохранено в sample.bak

Для редактирования встроенного без резервного копирования используйте следующую команду

Одно замечание: sed не может самостоятельно записывать файлы, поскольку единственная цель sed – действовать как редактор в потоке (например, конвейеры stdin, stdout, stderr и других >&n буферов, розетки и т.п.). Имея это в виду, вы можете использовать другую команду tee для записи вывода обратно в файл. Другой вариант – создать патч из конвейера содержимого в diff .

Метод тройника

Метод исправления

sed ‘/regex/’ | diff -p /dev/stdin | patch

Также обратите внимание, что патч получит файл для изменения из строки 1 выходного сигнала diff:

Патч не должен знать, к какому файлу обращаться, поскольку он найден в первой строке вывода из diff:

Невозможно выполнить то, что вы хотите, с помощью sed . Даже версии sed , которые поддерживают параметр -i для редактирования файла на месте, делают именно то, что вы явно заявили, что не хотите: они записывают во временный файл и затем переименовывают файл. Но, возможно, вы можете просто использовать ed . Например, чтобы изменить все вхождения от foo до bar в файле file.txt , вы можете сделать:

Синтаксис похож на sed , но, конечно, не совсем то же самое.

Но, возможно, вам стоит подумать, почему вы не хотите использовать переименованный временный файл. Даже если у вас нет поддержки -i sed , вы можете легко написать script, чтобы выполнить эту работу для вас. Вместо sed -i ‘s/foo/bar/g’ file вы можете сделать inline file sed ‘s/foo/bar/g’ . Такой script тривиально писать. Например:

должен быть достаточным для большинства целей.

sed поддерживает редактирование на месте. От man sed :

Пример:

Скажем, у вас есть файл hello.txt с текстом:

Если вы хотите сохранить резервную копию старого файла, используйте:

В итоге вы получите два файла: hello.txt с контентом:

и hello.txt.bak со старым контентом.

Если вы не хотите сохранять копию, просто не передавайте параметр расширения.

Вы можете использовать vi

Сохранять все жесткие ссылки, так как вывод перенаправляется на перезапись содержимого исходного файла и позволяет избежать необходимости в специальной версии sed.

Если вы заменяете одинаковое количество символов и после тщательного чтения “На месте” редактирование файлов…

Вы также можете использовать оператор перенаправления <> , чтобы открыть файл для чтения и записи:

Смотрите в прямом эфире:

вызывает файл, имя которого является расширением слова, которое нужно открыть для как чтение, так и запись в дескрипторе файла n или в дескрипторе файла 0 если n не указано. Если файл не существует, он создается.

Вы не указали, какую оболочку используете, но с zsh вы можете использовать конструкцию =( ) для достижения этой цели. Что-то вроде:

=( ) похож на >( ) , но создает временный файл, который автоматически удаляется при завершении cp .

Как Moneypenny сказал в Skyfall: “Иногда старые способы лучше”. Кинкейд сказал нечто подобное позже.

Приятного редактирования на месте. Добавлен \nw\n для записи файла. Извиняюсь за задержку ответа на запрос.

Очень хорошие примеры. У меня была проблема редактирования на месте многих файлов, и опция -i, по-видимому, является единственным разумным решением, использующим его в команде find. Здесь script добавить “версию:” перед первой строкой каждого файла:

Источник

Команда sed Linux

Команда sed — это потоковый редактор текста, работающий по принципу замены. Его можно использовать для поиска, вставки, замены и удаления фрагментов в файле. С помощью этой утилиты вы можете редактировать файлы не открывая их. Будет намного быстрее если вы напишите что и на что надо заменить, чем вы будете открывать редактор vi, искать нужную строку и вручную всё заменять.

В этой статье мы рассмотрим основы использования команды sed linux, её синтаксис, а также синтаксис регулярных выражений, который используется непосредственно для поиска и замены в файлах.

Команда sed в Linux

Сначала рассмотрим синтаксис команды:

$ sed опции -e команды файл

А вот её основные опции:

  • -n, —quiet — не выводить содержимое буфера шаблона в конце каждой итерации;
  • -e — команды, которые надо выполнить для редактирования;
  • -f — прочитать команды редактирования из файла;
  • -i — сделать резервную копию файла перед редактированием;
  • -l — указать свою длину строки;
  • -r — включить поддержку расширенного синтаксиса регулярных выражений;
  • -s — если передано несколько файлов, рассматривать их как отдельные потоки, а не как один длинный.

Я понимаю, что сейчас всё очень сложно, но к концу статьи всё прояснится.

1. Как работает sed

Теперь нужно понять как работает команда sed. У утилиты есть два буфера, это активный буфер шаблона и дополнительный буфер. Оба изначально пусты. Программа выполняет заданные условия для каждой строки в переданном ей файле.

sed читает одну строку, удаляет из неё все завершающие символы и символы новой строки и помещает её в буфер шаблона. Затем выполняются переданные в параметрах команды, с каждой командой может быть связан адрес, это своего рода условие и команда выполняется только если подходит условие.

Когда всё команды будут выполнены и не указана опция -n, содержимое буфера шаблона выводится в стандартный поток вывода перед этим добавляется обратно символ перевода строки. если он был удален. Затем запускается новая итерация цикла для следующей строки.

Если не используются специальные команды, например, D, то после завершения одной итерации цикла содержимое буфера шаблона удаляется. Однако содержимое предыдущей строки хранится в дополнительном буфере и его можно использовать.

2. Адреса sed

Каждой команде можно передать адрес, который будет указывать на строки, для которых она будет выполнена:

  • номер — позволяет указать номер строки, в которой надо выполнять команду;
  • первая

шаг — команда будет выполняется для указанной в первой части сроки, а затем для всех с указанным шагом;

  • $ — последняя строка в файле;
  • /регулярное_выражение/ — любая строка, которая подходит по регулярному выражению. Модификатор l указывает, что регулярное выражение должно быть не чувствительным к регистру;
  • номер, номер — начиная от строки из первой части и заканчивая строкой из второй части;
  • номер, /регулярное_выражение/ — начиная от сроки из первой части и до сроки, которая будет соответствовать регулярному выражению;
  • номер, +количество — начиная от номера строки указанного в первой части и еще плюс количество строк после него;
  • номер,

    число — начиная от строки номер и до строки номер которой будет кратный числу.

    Если для команды не был задан адрес, то она будет выполнена для всех строк. Если передан один адрес, команда будет выполнена только для строки по этому адресу. Также можно передать диапазон адресов. Тогда адреса разделяются запятой и команда будет выполнена для всех адресов диапазона.

    3. Синтаксис регулярных выражений

    Вы можете использовать такие же регулярные выражения, как и для Bash и популярных языков программирования. Вот основные операторы, которые поддерживают регулярные выражения sed Linux:

    • * — любой символ, любое количество;
    • \+ — как звездочка, только один символ или больше;
    • \? — нет или один символ;
    • \ — любой символ в количестве i;
    • \ — любой символ в количестве от i до j;
    • \ — любой символ в количестве от i и больше.

    4. Команды sed

    Если вы хотите пользоваться sed, вам нужно знать команды редактирования. Рассмотрим самые часто применяемые из них:

    • # — комментарий, не выполняется;
    • q — завершает работу сценария;
    • d — удаляет буфер шаблона и запускает следующую итерацию цикла;
    • p — вывести содержимое буфера шаблона;
    • n — вывести содержимое буфера шаблона и прочитать в него следующую строку;
    • s/что_заменять/на_что_заменять/опции — замена символов, поддерживаются регулярные выражения;
    • y/символы/символы — позволяет заменить символы из первой части на соответствующие символы из второй части;
    • w — записать содержимое буфера шаблона в файл;
    • N — добавить перевод строки к буферу шаблона;
    • D — если буфер шаблона не содержит новую строку, удалить его содержимое и начать новую итерацию цикла, иначе удалить содержимое буфера до символа перевода строки и начать новую итерацию цикла с тем, что останется;
    • g — заменить содержимое буфера шаблона, содержимым дополнительного буфера;
    • G — добавить новую строку к содержимому буфера шаблона, затем добавить туда же содержимое дополнительного буфера.

    Утилите можно передать несколько команд, для этого их надо разделить точкой с запятой или использовать две опции -e. Теперь вы знаете всё необходимое и можно переходить к примерам.

    Примеры использования sed

    Теперь рассмотрим примеры sed Linux, чтобы у вас сложилась целостная картина об этой утилите. Давайте сначала выведем из файла строки с пятой по десятую. Для этого воспользуемся командой -p. Мы используем опцию -n чтобы не выводить содержимое буфера шаблона на каждой итерации, а выводим только то, что нам надо. Если команда одна, то опцию -e можно опустить и писать без неё:

    sed -n ‘5,10p’ /etc/group

    Или можно вывести весь файл, кроме строк с первой по двадцатую:

    sed ‘1,20d’ /etc/group

    Здесь наоборот, опцию -n не указываем, чтобы выводилось всё, а с помощью команды d очищаем ненужное. Дальше рассмотрим замену в sed. Это самая частая функция, которая применяется вместе с этой утилитой. Заменим вхождения слова root на losst в том же файле и выведем всё в стандартный вывод:

    sed ‘s/root/losst/g’ /etc/group

    Флаг g заменяет все вхождения, также можно использовать флаг i, чтобы сделать регулярное выражение sed не зависимым от регистра. Для команд можно задавать адреса. Например, давайте выполним замену 0 на 1000, но только в строках с первой по десятую:

    sed ‘1,10 s/0/1000/g’ /etc/group

    Переходим ещё ближе к регулярным выражениям, удалим все пустые строки или строки с комментариями из конфига Apache:

    sed ‘/^#\|^$\| *#/d’ /etc/apache2/apache2.conf

    Под это регулярное выражение (адрес) подпадают все строки, которые начинаются с #, пустые, или начинаются с пробела, а за ним идет решетка. Регулярные выражения можно использовать и при замене. Например, заменим все вхождения p в начале строки на losst_p:

    sed ‘s/[$p*]/losst_p/g’ /etc/group

    Если вам надо записать результат замены в обратно в файл можно использовать стандартный оператор перенаправления вывода > или утилиту tee. Например:

    sed ‘/^#\|^$\| *#/d’ /etc/apache2/apache2.conf | sudo tee /etc/apache2/apache2.conf

    Также можно использовать опцию -i, тогда утилита не будет выполнять изменения в переданном ей файле:

    sudo sed -i ‘/^#\|^$\| *#/d’ /etc/apache2/apache2.conf

    Если надо сохранить оригинальный файл, достаточно передать опции -i в параметре расширение для файла резервной копии.

    Выводы

    Из этой статьи вы узнали что представляет из себя команда sed Linux. Как видите, это очень гибкий инструмент, который позволяет делать с текстом очень многое. Он сложный в освоении, но с помощью него очень удобно решать многие задачи редактирования конфигурационных файлов или фильтрации вывода.

    Источник

    Читайте также:  Как обновить драйвера hdmi windows 10
    Оцените статью