Подтвердить что ты не робот

Обработка на месте с помощью grep

У меня есть script, который вызывает grep для обработки текстового файла. В настоящее время я делаю что-то вроде этого.

$ grep 'SomeRegEx' myfile.txt > myfile.txt.temp
$ mv myfile.txt.temp myfile.txt

Мне интересно, есть ли способ сделать внутреннюю обработку, как хранить результаты в том же исходном файле без создания временного файла, а затем заменить оригинал временным файлом, когда обработка будет выполнена.

Конечно, я приветствую замечания относительно того, почему это должно или не должно быть сделано, но меня в основном интересует, можно ли это сделать. В этом примере я использую grep, но меня интересуют инструменты Unix в целом. Спасибо!

4b9b3361

Ответ 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.