Изменение файлов на лету в Linux (пишущий для ввода файл на канале)

Вы, вероятно, найдете некоторую 'оперативную' справку от каналов IRC Ubuntu. Существует много дружелюбных услужливых людей, которые будут стараться изо всех сил помогать Вам. Это может быть легче, чем ожидание ответов здесь в SF.

Ubuntu IRC:https://help.ubuntu.com/community/InternetRelayChat
Форумы Ubuntu: http://ubuntuforums.org/

6
задан 24 June 2009 в 14:13
6 ответов

Я предположил бы, что sed все еще мог бы создать временный файл, но следующее могло бы сделать то, что Вы хотите? (Используя strace на этом мог бы показать Вам, если sed создает временный файл или не).

sed -i '/bar/!d' foo.txt

Восклицание инвертирует соответствие, d для, удаляют, таким образом, это удаляет все строки, которые не имеют панели в них.

6
ответ дан 2 December 2019 в 23:59

Попытайтесь использовать губку от moreutils как это:

sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd

Это собирает целый вход прежде, чем записать в, он производится.

13
ответ дан 2 December 2019 в 23:59
  • 1
    Я никогда не знал о губке, that' s fantasic инструмент, который решает раздражающую проблему –  Rory 18 December 2009 в 15:01

Используйте>> для сохранения содержания.

cat foo.txt | grep bar >> foo.txt

Теперь, когда добавит в файл.

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

1
ответ дан 2 December 2019 в 23:59

В зависимости от того, насколько сложный Ваша командная строка, можно получить пробег из

cat foo.txt | grep bar | tee -a foo.txt
1
ответ дан 2 December 2019 в 23:59

Лучший способ сделать это должно помнить, как работа файлов в Unix - файл существует, пока существует ссылка на файл (каталог или процесс, открывающий файл).

Так, откройте файл, удалите ту запись каталога, затем выполните Ваш процесс, который пишет в новую запись каталога с тем же именем, но связанный с другим inode.

Наконец, хорошая вещь об этом состоит в том, что это работает на любой вид конвейерной эксплуатации, не только вещи, которые могут сделать временный взлом буфера файлов.

{ rm file ; sed -e s/this/that/g > file ; } < file

Слово предупреждения - это может вызвать аварию, если у Вас должен быть Ваш переписывающий быть атомарной операцией. Unix не предлагает очевидные способы блокировки файлов, особенно не на уровне оболочки. Это было проблемой в средневековье при выполнении чего-то как редактирование файла паролей в занятой системе, которая выполняла что-то как NIS. Любое время, которое больше чем один процесс читает / пишущий в файл, быть очень осторожным, если Ваша система занята или важна.

Единственные операции, которые на 100% несомненно на будут атомарными, являются манипуляциями записью каталога - комната / ln / mv (в той же файловой системе).

Таким образом, теперь вещи становятся длиннее и более ужасными..

Математическая часть этого требует оболочки posix или столь же расширенной оболочки Bourne

c=0
    while
      f=$SECONDS
      test -f file.$c.tmp
    do
      c=$(($c+1))
    done

  grep stuff < file > file.$c.tmp && mv file.$c.tmp file
0
ответ дан 2 December 2019 в 23:59

Ooops, UUOC, бесполезное использование кошки :) Вам не нужна кошка там:

grep something somefile > someotherfile

Как sekenre сказал, существует губка. Или возможно можно хотеть попробовать жемчуг встроенный выпуск (-i переключатель):

  • печать, только соответствующая выводу:

    жемчуг-ni-e 'm/foo/g и печать' bar.txt

  • замените "нечто" "панелью" в файле:

    жемчуг - пи-e 's/foo/bar/g' bar.txt

0
ответ дан 2 December 2019 в 23:59

Теги

Похожие вопросы