Замена текста (чтение из файла и сохранение в тот же файл) в 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
на самом деле не предназначен для редактирования на месте; исторически это фильтр, программа, которая редактирует поток данных в конвейере, и для этого вам нужно будет записать во временный файл, а затем переименовать его.
причина, по которой вы получаете пустой файл, заключается в том, что оболочка открывает (и усекает) файл перед запуском команды.
редактирование на месте с помощью 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