Unix: добавление файла без фиктивного файла? - PullRequest
7 голосов
/ 23 марта 2010

не хочу:

$ cat file > dummy; $ cat header dummy > file

Я хочу подобную команду ниже, но не до конца, а до начала:

$ cat header >> file

Ответы [ 8 ]

10 голосов
/ 23 марта 2010

Вы не можете добавить в начало файла, не переписав файл. Первый способ, который вы дали, это правильный способ сделать это.

3 голосов
/ 23 ноября 2011

Это легко сделать в sed, если вы можете встроить строку заголовка непосредственно в команду:

$ sed -i "1iheader1,header2,header3"

Или, если вы действительно хотите прочитать его из файла, вы можете сделать это с помощью bash:

$ sed -i "1i$(<header)" file

ВНИМАНИЕ , что "-i" перезаписывает входной файл с результатами. Если вы хотите, чтобы sed делал резервную копию, измените его на «-i.bak» или аналогичный, и, конечно, всегда сначала проверяйте образцы данных во временном каталоге, чтобы убедиться, что вы понимаете, что произойдет, прежде чем применять к своим реальным данным .

2 голосов
/ 27 июня 2013

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

    echo "`cat header file`" > file

Тики заставляют часть внутри кавычек выполняться первыми, чтобы она не жаловалась на то, что выходной файл является входным файлом. Это похоже на решение hhh, но немного короче. Я полагаю, что если файлы действительно большие, это может вызвать проблемы, хотя, похоже, я видел, как оболочка жаловалась на то, что тики делают команды слишком давно. Где-то часть, которая выполняется в первую очередь, должна быть сохранена в буфере, чтобы оригинал мог быть перезаписан, но мне не хватает специалиста, чтобы знать, что / где будет этот буфер или насколько он велик.

1 голос
/ 14 февраля 2014

Одна из возможностей - использовать здесь документ:

cat > "prependedfile" << ENDENDEND
prepended line(s)
`cat "file"`
ENDENDEND

У этого трюка может быть ограничение памяти.

1 голос
/ 23 марта 2010

Невозможно выполнить переход к файлу, не прочитав все содержимое файла и не записав новый файл с добавленным текстом + содержимое файла. Думайте о файле в Unix как о потоке байтов - его легко добавить к концу потока, но нет простой операции, чтобы «перемотать» поток и записать в него. Даже операция поиска в начале файла перезапишет начало любых записанных вами данных.

0 голосов
/ 11 апреля 2017

Ниже приведена простая попытка c-shell решить эту проблему. Этот скрипт prepend.sh принимает два параметра:

  • $ 1 - файл, содержащий предварительно добавленную формулировку.
  • $ 2 - исходный / целевой файл для изменения.
#!/bin/csh
if (if ./tmp.txt) then
  rm ./tmp.txt
endif

cat $1 > ./tmp.txt
cat $2 >> ./tmp.txt

mv $2 $2.bak
mv ./tmp.txt $2
0 голосов
/ 23 сентября 2014

, если вы хотите предварительно перенести «заголовок» в «файл», почему бы не добавить «файл» в «заголовок»

cat file >> header
0 голосов
/ 23 марта 2010

Благодаря правильному поисковому запросу!

echo "include .headers.java\n$(cat fileObject.java )" > fileObject.java

Затем с файлом:

echo "$(cat .headers.java)\n\n$(cat fileObject.java )" > fileObject.java
...