2012-02-21 2 views
1

Я использую bash с linux для добавления содержимого в начало файла. До сих пор я знаю, что я могу это сделать, используя временный файл. так я делаю это так:Как добавить StdOut в верхнюю часть файла (а не снизу)?

tac lines.bar > lines.foo 
echo "a" >> lines.foo 
tac lines.foo > lines.bar 

Но есть лучший способ сделать это без того, чтобы написать второй файл?

ответ

2
echo a | cat - file1 > file2 

же, как shellter в

и СЭД в одной строке.

sed -i -e '1 i<whatever>' file1 

это будет вставлять в файл1 на месте. the sed example i referred to

+0

спасибо, что это именно то, что мне нужно. – l1zard

0

tac - очень «дорогое» решение, тем более, что вам нужно использовать его 2x. В то время как вы все еще необходимо использовать файл TMP, это займет меньше времени:

редактировать за примечаниями от KeithThompson, теперь использует имя файла и condtional /bin/mv «$$.».

{ 
    echo "a" 
    cat file1 
    } > file1.$$ && /bin/mv file1.$$ file1 

Я надеюсь, что это помогает

+1

Я бы, вероятно, написал это как '(echo" a "; cat file1)> file1. $$ && mv file1. $$ file1'. Суффикс '. $$' позволяет избежать клонирования любых существующих файлов, а' && 'избегает clobbering' file', если команда завершается с ошибкой. –

+0

Отличное обновление, спасибо. Я все же хотел бы поверить, что '{}' группы процессов более эффективны, хотя на практике я всегда вижу, что подпроцессы порождаются для таких вещей. – shellter

0

Использование именованного канал и в месте замены с sed, вы можете добавить вывод команды в верхней части файла без явной необходимости временного файла:

mkfifo output 
your_command >> output & 
sed -i -e '1x' -e '1routput' -e '1d' -e '2{H;x}' file 
rm output 

Что это делает буферизацию выхода your_command в именованном канале (fifo) и вставляет на место этот выход с использованием команды rsed. Для этого вам нужно запустить your_command в фоновом режиме, чтобы избежать блокировки вывода в fifo.

Обратите внимание, что команда r выводит файл в конце цикла, поэтому нам нужно буферизовать 1-ю строку файла в пространстве удержания, выводя его со второй строкой.

Я пишу без явного временного файла как sed может использовать один для себя.

Смежные вопросы