Обработка на месте с помощью grep
У меня есть script, который вызывает grep для обработки текстового файла. В настоящее время я делаю что-то вроде этого.
$ grep 'SomeRegEx' myfile.txt > myfile.txt.temp
$ mv myfile.txt.temp myfile.txt
Мне интересно, есть ли способ сделать внутреннюю обработку, как хранить результаты в том же исходном файле без создания временного файла, а затем заменить оригинал временным файлом, когда обработка будет выполнена.
Конечно, я приветствую замечания относительно того, почему это должно или не должно быть сделано, но меня в основном интересует, можно ли это сделать. В этом примере я использую grep
, но меня интересуют инструменты Unix в целом. Спасибо!
Ответы
Ответ 1
Perl имеет переключатель -i
, поэтому sed
и Ruby
sed -i.bak -n '/SomeRegex/p' file
ruby -i.bak -ne 'print if /SomeRegex/' file
Но помните, что все, что он когда-либо делал, это создавать временные файлы на заднем конце, которые, по вашему мнению, вы не видите, все.
Другие способы, кроме grep
AWK
awk '/someRegex/' file > t && mv t file
bash
while read -r line;do case "$line" in *someregex*) echo "$line";;esac;done <file > t && mv t file
Ответ 2
sponge
(в пакете moreutils
в Debian/Ubuntu) читает ввод до EOF и записывает его в файл, поэтому вы можете grep и записать его обратно в себя.
Вот так:
grep 'pattern' file | sponge file
Ответ 3
В общем, это невозможно. Но Perl имеет переключатель -i
:
perl -i -ne 'print if /SomeRegEx/' myfile.txt
Запись -i.bak
приведет к сохранению оригинала в myfile.txt.bak
.
(Конечно, внутренне, Perl просто делает то, что вы уже делаете - нет особой магии.)
Ответ 4
Нет, вообще не может быть сделано в Unix, как это. Вы можете создавать/усекать (с помощью > ) или добавлять к файлу (с помощью → ). После усечения старое содержимое будет потеряно.
Ответ 5
Большинство установок sed
могут выполнять редактирование на месте, проверьте справочную страницу, вы, вероятно, хотите флаг -i
.
Ответ 6
Чтобы редактировать файл на месте с помощью vim-way, попробуйте:
$ ex -s +'%!grep foo' -cxa myfile.txt
В качестве альтернативы используйте sed
или gawk
.
Ответ 7
Взгляните на мои слайды "Полевое руководство к параметрам командной строки Perl" в http://petdance.com/perl/command-line-options.pdf, чтобы узнать больше о том, что вы можете делать с Perl.