Як я можу отримати команду sed для внесення постійних змін у файл?


32

Чи можливо це? Я десь прочитав, що це зробить наступна команда:

sed -e [команда] [файл]

але, здавалося, робити те саме, що і просто

sed [команда] [файл]

(зміни не зберегли). Чи можна це зробити за допомогою sed?


2
-eПрапор означає вираз. Ви, мабуть, хочете, щоб -iпрапор це означає, in-placeі я настійно рекомендую вам використовувати sed -i.bak 's/../' filename
Валентин Байрамі

Відповіді:


50

Я думаю, ти шукаєш -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реалізаціями.


4
Зауважте, що сторінка man неправильна. sedне робить на місці редагування. Створюється новий файл і перезаписується старий, змінюється inode.
Марко

2
@Marco Це безпечний спосіб редагування файлу на місці. "Редагування файлу на місці" в документації sed означає, що вихідний файл (як визначено його ім'ям) модифіковано, а не те, що вихідний файл (як визначено його inode) модифікований.
Жил 'SO- перестань бути злим'

2
@Gilles Я повністю згоден, що це кращий спосіб редагування файлу, але навряд чи я б назвав його на місці . Але це зводиться до питання про те, як ідентифікується файл, за inode або за назвою. Я б сказав по inode, інакше contructs як { rm file; cmd > file; } < fileби приводить до висновку, що cmd читає і записує в той самий файл, що і ні. Це два файли distince, які просто мають однакове ім'я. Але я не хочу тут починати дискусію.
Марко

На macOS 10.14 я отримую sed: 1: "foo.txt": invalid command code fпід час роботи sed -i 's/o/X/g' foo.txt. Однак надання розширення, як і sed -i .bak 's/o/X/g' foo.txtдобре, працює. Будь-які ідеї, як змусити його працювати без створення резервних файлів?
Джошуа Пінтер

1
Гаразд, розібрався. У macOS вам потрібно явно додати порожній рядок для параметрі параметра розширення:sed -i '' 's/o/X/g' foo.txt
Джошуа Пінтер


1

-eПараметр призначений для виконання декількох sedкоманд

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

вважати file.txtяк

linux os

то O / P є

unix os

-i опція зберігає зміни назавжди ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.