Как мне получить команду 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
Обратите внимание, что справочная страница неверна. sedне выполняет редактирование на месте. Создает новый файл и перезаписывает старый, изменяется индекс.
Марко

2
@Marco Это безопасный способ редактирования файла на месте. «Редактирование файла на месте» в документации sed означает, что исходный файл (как определено его именем) изменен, а не то, что исходный файл (как определено его inode) изменен.
Жиль "ТАК - перестань быть злым"

2
@ Жиль Я полностью согласен с тем, что это предпочтительный способ редактирования файла, но я бы вряд ли назвал его на месте . Но это сводится к вопросу о том, как файл идентифицируется, по inode или по имени. Я бы сказал, что inode, в противном случае, например, как contructs, { rm file; cmd > file; } < fileможно сделать вывод, что cmd читает и пишет в один и тот же файл, чего не происходит. Это два разных файла, которые просто имеют одно и то же имя. Но я не хочу начинать обсуждение здесь.
Марко

На 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
Joshua Pinter

2

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

1 { rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > 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


Вы не можете использовать tee askubuntu.com/a/752451
Стивен Пенни

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.