Подстановка текста (чтение из файла и сохранение в тот же файл) в Linux с sed - PullRequest
15 голосов
/ 26 июня 2011

Я хочу прочитать файл "teste", сделать несколько "найти и заменить" и переписать "teste" с результатами.Чем ближе я до сих пор:

$cat teste
I have to find something
This is hard to find...
Find it wright now!

$sed -n 's/find/replace/w teste1' teste

$cat teste1
I have to replace something
This is hard to replace...

Если я попытаюсь сохранить в тот же файл, как этот:

$sed -n 's/find/replace/w teste' teste

или:

$sed -n 's/find/replace/' teste > teste

Результатом будет пустой файл ...

Я знаю, что упускаю что-то очень глупое, но любая помощь будет приветствоваться.


ОБНОВЛЕНИЕ: на основе советов, данных людьми иэта ссылка: http://idolinux.blogspot.com/2008/08/sed-in-place-edit.html вот мой обновленный код:

sed -i -e 's/find/replace/g' teste 

Ответы [ 6 ]

24 голосов
/ 26 июня 2011

В Linux sed -i - это путь. sed на самом деле не предназначен для редактирования на месте; исторически это фильтр, программа, которая редактирует поток данных в конвейере, и для этого использования вам нужно будет записать во временный файл, а затем переименовать его.

Причина, по которой вы получаете пустой файл, заключается в том, что оболочка открывает (и усекает) файл перед выполнением команды.

9 голосов
/ 26 июня 2011

Вы хотите: sed -i 's/foo/bar/g' file

2 голосов
/ 27 июня 2011

Редактирование на месте с помощью Perl

perl -pi -w -e 's/foo/bar/g;' file.txt

или

perl -pi -w -e 's/foo/bar/g;' files*

для многих файлов

2 голосов
/ 26 июня 2011

Вы хотите использовать "sed -i".Это обновление на месте.

1 голос
/ 17 апреля 2018

На самом деле, если вы используете флаг -i, sed скопирует оригинальную строку, которую вы редактируете.

Так что это может быть лучше:

sed -i -e 's/old/new/g' -e '/new/d' file
0 голосов
/ 27 июня 2011

Решение ed:

ed teste <<END
1,$s/find/replace/g
w
q
END

Или без heredoc

printf "%s\n" '1,$s/find/replace/g' w q | ed teste
...