Вы, вероятно, найдете некоторую 'оперативную' справку от каналов IRC Ubuntu. Существует много дружелюбных услужливых людей, которые будут стараться изо всех сил помогать Вам. Это может быть легче, чем ожидание ответов здесь в SF.
Ubuntu IRC:https://help.ubuntu.com/community/InternetRelayChat
Форумы Ubuntu: http://ubuntuforums.org/
Я предположил бы, что sed все еще мог бы создать временный файл, но следующее могло бы сделать то, что Вы хотите? (Используя strace на этом мог бы показать Вам, если sed создает временный файл или не).
sed -i '/bar/!d' foo.txt
Восклицание инвертирует соответствие, d для, удаляют, таким образом, это удаляет все строки, которые не имеют панели в них.
Попытайтесь использовать губку от moreutils как это:
sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
Это собирает целый вход прежде, чем записать в, он производится.
Используйте>> для сохранения содержания.
cat foo.txt | grep bar >> foo.txt
Теперь, когда добавит в файл.
AFAIK, нет никакого прямого способа предварительно ожидать данные в файл в оболочке. Если Вы хотите предварительно ожидать Вас, возможно, должен использовать временный промежуточный файл.
Лучший способ сделать это должно помнить, как работа файлов в 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
Ooops, UUOC, бесполезное использование кошки :) Вам не нужна кошка там:
grep something somefile > someotherfile
Как sekenre сказал, существует губка. Или возможно можно хотеть попробовать жемчуг встроенный выпуск (-i переключатель):
печать, только соответствующая выводу:
жемчуг-ni-e 'm/foo/g и печать' bar.txt
замените "нечто" "панелью" в файле:
жемчуг - пи-e 's/foo/bar/g' bar.txt