Как я могу добавить StdOut в начало файла (не внизу)? - PullRequest
1 голос
/ 21 февраля 2012

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

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

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

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012
echo a | cat - file1 > file2

то же самое, что и

в оболочке и sed в одной строке.

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

это вставит в file1 на месте. пример sed, на который я ссылался

0 голосов
/ 21 февраля 2012

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

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

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

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

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

0 голосов
/ 21 февраля 2012

TAC - очень «дорогое» решение, особенно если вам нужно использовать его 2 раза.Хотя вам все еще нужно использовать tmp-файл, это займет меньше времени:

edit на заметки из KeithThompson, теперь используя имя файла. $$ и условный /bin/mv.

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

Надеюсь, это поможет

...