Оболочка один лайнер, чтобы подготовить к файлу - PullRequest
124 голосов
/ 10 сентября 2008

Это, вероятно, комплексное решение .

Я ищу простой оператор, такой как ">>", но для добавления.

Боюсь, его не существует. Я должен сделать что-то вроде

 mv myfile tmp
 cat myheader tmp > myfile

Что-нибудь умнее?

Ответы [ 32 ]

8 голосов
/ 26 октября 2010

РЕДАКТИРОВАТЬ: Это сломано. См. Странное поведение при добавлении файла с кошкой и тройником

Для решения проблемы перезаписи используется tee:

cat header main | tee main > /dev/null
7 голосов
/ 28 февраля 2012

Как предлагает Даниэль Велков, используйте тройник.
Для меня это простое умное решение:

{ echo foo; cat bar; } | tee bar > /dev/null
3 голосов
/ 24 мая 2011

Тот, который я использую. Этот позволяет вам указать порядок, дополнительные символы и т. Д. Так, как вам нравится:

echo -e "TEXTFIRSt\n$(< header)\n$(< my.txt)" > my.txt

P.S .: только он не работает, если файлы содержат текст с обратной косой чертой, потому что он интерпретируется как escape-символы

3 голосов
/ 08 июля 2013

В основном для веселья / ракушек, но

ex -c '0r myheader|x' myfile

поможет, и нет никаких конвейеров или перенаправлений. Конечно, vi / ex на самом деле не для неинтерактивного использования, поэтому vi на короткое время вспыхнет.

2 голосов
/ 21 ноября 2011

Вот что я обнаружил:

echo -e "header \n$(cat file)" >file
2 голосов
/ 06 марта 2011

ВНИМАНИЕ: для удовлетворения потребностей ОП требуется немного больше работы.

Должен быть способ заставить подход sed работать @shixilun, несмотря на его опасения. Должна быть команда bash, позволяющая избежать пробелов при чтении файла в заменяющую строку sed (например, заменить символы новой строки на \ n '. Команды оболочки vis и cat могут работать с непечатаемыми символами, но не с пробелами, поэтому не решит проблему ОП:

sed -i -e "1s/^/$(cat file_with_header.txt)/" file_to_be_prepended.txt

терпит неудачу из-за необработанных строк новой строки в сценарии замены, которые должны начинаться с символа продолжения строки () и, возможно, после символа &, чтобы сохранить оболочку и sed счастливыми, как этот ответ SO

sed имеет ограничение размера 40 КБ для неглобальных команд поиска-замены (без трейлинга / g после шаблона), поэтому, скорее всего, можно избежать страшных проблем переполнения буфера в awk, о которых предупреждает анонимный пользователь.

2 голосов
/ 02 марта 2010

Вариант решения cb0 для «без временного файла» для добавления фиксированного текста:

echo "text to prepend" | cat - file_to_be_modified | ( cat > file_to_be_modified ) 

Опять же, это зависит от выполнения под-оболочки - (..) - чтобы избежать отказа кота иметь один и тот же файл для ввода и вывода.

Примечание: понравилось это решение. Тем не менее, в моем Mac исходный файл потерян (думал, что не должен, но это делает). Это можно исправить, написав ваше решение как: эхо "текст для добавления" | кот - file_to_be_modified | cat> tmp_file; mv tmp_file file_to_be_modified

2 голосов
/ 08 апреля 2011

Почему бы просто не использовать команду ed (как уже было предложено здесь)?

ed считывает весь файл в память и автоматически выполняет редактирование файла на месте!

Итак, если ваш файл не такой большой ...

# cf. "Editing files with the ed text editor from scripts.",
# http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed

prepend() {
   printf '%s\n' H 1i "${1}" . wq | ed -s "${2}"
}

echo 'Hello, world!' > myfile
prepend 'line to prepend' myfile

Еще один обходной путь - использование дескрипторов открытых файлов, как предложил Юрген Хетцель в Перенаправить вывод из sed 's / c / d /' myFile в myFile

echo cat > manipulate.txt
exec 3<manipulate.txt
# Prevent open file from being truncated:
rm manipulate.txt
sed 's/cat/dog/' <&3 > manipulate.txt

Все это, конечно, можно поместить в одну строку.

2 голосов
/ 06 мая 2012
sed -i -e '1rmyheader' -e '1{h;d}' -e '2{x;G}' myfile
1 голос
/ 07 января 2016

Вы можете использовать командную строку perl:

perl -i -0777 -pe 's/^/my_header/' tmp

Где -i создаст встроенную замену файла и -0777 похитит весь файл и заставит ^ соответствовать только началу. -pe напечатает все строки

Или, если my_header - это файл:

perl -i -0777 -pe 's/^/`cat my_header`/e' tmp

Где / e разрешает ввод кода в замене.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...