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

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

$ chsh -s /bin/bash

Затем выпишитесь и въезжайте задним ходом.

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

33
28.10.2014, 04:14
3 ответа

Я думаю, что Вы ищете -i:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

Например:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

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

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

Входной файл изменяется, и резервное копирование, содержащее исходные данные файла, создается.

Также обратите внимание, что это для GNU sed, существуют незначительные различия в формате между различным sed реализации.

51
27.01.2020, 19:37
  • 1
    Обратите внимание, что страница справочника является неправильной. sed не делает оперативного редактирования. Это создает новый файл и перезаписывает старый, изменения inode. –  Marco 13.10.2013, 22:45
  • 2
    @Marco Это - безопасный способ отредактировать файл на месте. “Редактирование файла на месте” в sed документации означает, что исходный файл (как определено его именем) изменяется, не, что исходный файл (как определено его inode) изменяется. –  Gilles 'SO- stop being evil' 14.10.2013, 01:13
  • 3
    @Gilles я полностью соглашаюсь, что это - предпочтительный способ отредактировать файл, но я едва назвал бы его оперативным. Но это сводится к вопросу того, как файл определяется inode или по имени. Я сказал бы inode, иначе конструкции как { rm file; cmd > file; } < file привел бы к заключению, что чтения cmd и записи в тот же файл, который это не делает. Это - два distince файла, которые просто, оказывается, имеют то же имя. Но я не хочу запускать обсуждение здесь. –  Marco 14.10.2013, 01:38

Это решение работает для HPUX (UNIX):

1. { rm test1.sh && awk '{gsub("Ошибка", "NO_Error", $0); вывод на печать}' > test1.sh; } < test1.sh:

2. perl -pi -e 's/Error/NO_Error/g' test1.sh

3. sed 's/Error/NO_Error/g' test1.sh | tee test1.sh

2
27.01.2020, 19:37
Параметр

-e предназначен для выполнения нескольких команд sed

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

рассматривает file.txt как

linux os

, тогда O / P равно

unix os

-i опция сохраняет изменения навсегда ...

1
27.01.2020, 19:37

Теги

Похожие вопросы