Обработка на месте с помощью grep - PullRequest
24 голосов
/ 20 октября 2010

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

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

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

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

Ответы [ 8 ]

15 голосов
/ 28 июня 2015

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

Как это:

grep 'pattern' file | sponge file
14 голосов
/ 20 октября 2010

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
4 голосов
/ 20 октября 2010

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

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

Запись -i.bak приведет к тому, что оригинал будет сохранен в myfile.txt.bak.

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

2 голосов
/ 20 октября 2010

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

0 голосов
/ 09 ноября 2018

Сохранить в переменной и затем присвоить ее исходному файлу:

A=$(cat aux.log | grep 'Something') && echo "${A}" > aux.log
0 голосов
/ 19 апреля 2015

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

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

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

0 голосов
/ 20 октября 2010

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

0 голосов
/ 20 октября 2010

Посмотрите мои слайды "Руководство по использованию параметров командной строки Perl" на http://petdance.com/perl/command-line-options.pdf, чтобы получить больше идей о том, что вы можете сделать с помощью Perl.

...