2010-10-20 1 views
20

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

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

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

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

ответ

12

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 

Баш

while read -r line;do case "$line" in *someregex*) echo "$line";;esac;done <file > t && mv t file 
+0

Как в AWK и Баш примеры улучшения на оригинальном Grep, кроме '&&' вместо ' ; '? Они все еще явно создают временный файл. –

2

Нет, в общем, это невозможно сделать в Unix, как это. Вы можете создавать/усекать (с помощью>) или добавлять к файлу (с помощью >>). После усечения старое содержимое будет потеряно.

3

В общем, это невозможно. Но Perl имеет -i переключатель:

perl -i -ne 'print if /SomeRegEx/' myfile.txt 

Запись -i.bak заставит оригинала сохранены в myfile.txt.bak.

(Конечно, внутренне, Perl просто делает в основном то, что вы уже делаете. - нет никакого особого волшебства)

+2

получил его в то время как я искал его - +1 для скорости –

0

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

0

Чтобы редактировать файл в месте с помощью ВИМ-путь, попробуйте:

$ ex -s +'%!grep foo' -cxa myfile.txt 

В качестве альтернативы использовать sed или gawk.

11

sponge (в пакете moreutils в Debian/Ubuntu) считывает ввод до EOF и записывает его в файл, поэтому вы можете grep-файл и записывать его обратно в себя.

Как это:

grep 'pattern' file | sponge file 
Смежные вопросы