Замена текста (чтение из файла и сохранение в тот же файл) в linux с помощью sed

Я хочу прочитать файл "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 ответов


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

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


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


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


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

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

или

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

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


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

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

sed -i -e 's/old/new/g' -e '/new/d' file

на 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