Добавьте строки к началу и концу огромного файла

KDE 3 не имеет snap-to-halfscreen функции. Если Вы не можете установить другое программное обеспечение, то у Вас не будет доступа функцией.

Однако Ваша жизнь может быть сделана легче к середине - и щелкающий правой кнопкой по максимизировать кнопке хрома окна. Щелчок средней кнопкой максимизирует вертикально, и щелчок правой кнопкой максимизирует горизонтально. Затем только необходимо изменить размер одного размера, не два.

24
22.08.2013, 14:59
8 ответов

sed -i использование tempfiles как деталь реализации, которая является тем, что Вы испытываете; однако, преднезаконченные данные к началу потока данных, не перезаписывая существующее содержание требуют перезаписи файла, нет никакого способа обойти это, избегая sed -i.

Если перезапись файла не является опцией, Вы могли бы рассмотреть управление им, когда это читается, например:

{ echo some prepended text ; cat file ; } | command

Кроме того, sed для редактирования потоков - файл не является потоком. Используйте программу, которая предназначена с этой целью, как редактор или напр. -i опция к sed не является только не портативной, это также повредит любые символьные ссылки на Ваш файл, так как это по существу удаляет его и воссоздает его, который бессмыслен.

Можно сделать это в единственной команде с ed как так:

ed -s file << 'EOF'
0a
prepend these lines
to the beginning
.
$a
append these lines
to the end
.
w
EOF

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

21
27.01.2020, 19:41
  • 1
    Привет, команда редактора, какой обеспеченный u работает очень хорошо на огромные файлы. Но у меня есть 3 огромных файла как Тест, Test1, Тест 2. Я дал команду как редактор-s, Tes* <<'EOF' 0a предварительно ожидают эти строки к началу. $a добавляют эти строки в конец. w EOF, Но его взятие только Тестовый файл и добавление первых/последних строк. Как мы можем внести изменения в той же команде так, чтобы она сделала, добавляет первая и последняя строка во всех файлах. –  UNIXbest 22.08.2013, 15:50
  • 2
    @UNIXbest - Используйте a for цикл: for file in Tes*; do [command]; done –  Chris Down 22.08.2013, 15:55
  • 3
    Привет Вниз я использовал ниже команды для файла в Tes*; сделайте редактора-s Tes* <<'EOF' 0a HEllO HDR. $a Привет TLR w EOF сделанный, Но его все еще запись в первый файл. –  UNIXbest 22.08.2013, 16:06
  • 4
    Право, потому что необходимо использовать "$file", нет Tes* как аргумент ed. –  Chris Down 22.08.2013, 16:25
  • 5
    @UNIXbest, Если Ваша проблема была решена этим ответом, необходимо рассмотреть принятие его. –  Joseph R. 22.08.2013, 16:55

Обратите внимание, что, если Вы не хотите выделять целую копию файла на диске, Вы могли сделать:

sed '
1i\
begin
$a\
end' < file 1<> file

Это использует то, это, когда его stdin/stdout является файлом, sed чтения и записи блоком. Таким образом, здесь, для него нормально переопределять файл, который это читает пока первая строка, которую Вы добавляете, меньше, чем sedразмер блока (должно быть что-то как 4k или 8k).

Отметьте хотя это если по некоторым причинам sed сбои (уничтоженный, катастрофический отказ машины...), Вы закончите с файлом, наполовину обработанным, который будет означать некоторые данные размер первой строки, отсутствующей где-нибудь в середине.

Также отметьте это если Ваш sed GNU sed, это не будет работать на двоичные данные (но так как Вы используете -i, Вы используете GNU sed).

9
27.01.2020, 19:41
  • 1
    это ошибки для меня на Ubuntu 16.04 –  Csaba Toth 09.11.2016, 21:11

Вот некоторые варианты (все из которых создадут новую копию файла так, удостоверяются, что у Вас есть достаточно пространства для того):

  • простое эхо/кошка

    echo "first" > new_file; cat $File >> new_file; \
      echo "last" >> new_file; 
    
  • awk/gawk и т.д.

    gawk 'BEGIN{print "first\n"}{print}END{print "last\n"}' $File > NewFile 
    

    awk и его род считал файлы линию за линией. BEGIN{} блок выполняется перед первой строкой и END{} блок после последней строки. Так, команда выше средств print "first" at the beginning, then print every line in the file and print "last" at the end.

  • Perl

    perl -ne 'BEGIN{print "first\n"} print;END{print "last\n"}' $File > NewFile
    

    Это - по существу то же самое как простофиля выше просто записанного в Perl.

4
27.01.2020, 19:41
  • 1
    Обратите внимание во всех этих случаях, требование по крайней мере на 14 ГБ большего количества пространства для нового файла. положительная сторона –  Chris Down 22.08.2013, 15:11
  • 2
    @ChrisDown, я отредактировал свой ответ, чтобы ясно дать понять. Я предположил, что это не было проблемой, так как OP использовал sed -i который создает временные файлы. –  terdon♦ 22.08.2013, 15:14

Нет никакого способа вставить данные в начале файла ¹, все, что можно сделать, создают новый файл, пишут дополнительные данные и добавляют старые данные. Таким образом, необходимо будет переписать целый файл, по крайней мере, однажды для вставки первой строки. Можно добавить последнюю строку, не переписывая файл как бы то ни было.

sed -i '1i\'"$FirstLine" $Filename
echo "$LastLine" >>$Filename

С другой стороны, можно объединить две команды в одном выполнении sed.

sed -i -e '1i\'"$FirstLine" -e '$ a\'"$Lastline" $Filename

sed -i создает новый выходной файл и затем перемещает его через старый файл. Это означает, что, в то время как sed работает, существует вторая копия файла, израсходовав пространство. Можно избежать этого путем перезаписи файла на месте, но с главными ограничениями: строка, которую Вы добавляете, должна быть меньшей, чем буфер sed, и если Ваша система откажет, то Вы закончите с поврежденным файлом и некоторым содержанием, потерянным в середине, таким образом, я настоятельно рекомендую против него.

¹ Linux действительно имеет способ вставить данные в файл, но это может только вставить целое число блоков файловой системы, это не может вставить строки произвольных длин. Это полезно для некоторых приложений, таково как базы данных и виртуальные машины, но это бесполезно для текстовых файлов.

2
27.01.2020, 19:41
[
$ (echo "Some Text" ; cat file1) > file2
].
0
27.01.2020, 19:41

Вы можете использовать Vim в режиме Ex:

ex -sc '1i|ALFA' -c '$a|BRAVO' -cx file
  1. 1 выделение первой строки

  2. i вставка текста и новой строки

  3. $ выделение последней строки

  4. a добавление текста и новой строки

  5. x сохранение и закрытие

2
27.01.2020, 19:41

Я предпочитаю гораздо более простой:

gsed -i '1s/^/foo\n/gm; $s/$/\nbar/gm' filename.txt

Это преобразует файл:

asdf
qwer

в файл:

foo
asdf
qwer
bar
3
27.01.2020, 19:41

Современные ядра Linux (выше 4.1 или 4.2 )поддерживают вставку данных в начало файла с помощью системного вызова fallocate()с FALLOC_FL_INSERT_RANGEв файловых системах ext4 и xfs. По сути, это операция логического сдвига :: данные логически перемещаются по более высокому смещению.

Существует ограничение в отношении детализации диапазона, который вы хотите вставить в начало файла. Но для текстовых файлов вы, вероятно, можете выделить немного больше, чем требуется (до границы детализации )и заполнить пробелами или возвратом каретки, но это зависит от вашего приложения

Я не знаю какой-либо доступной утилиты Linux, которая манипулирует размерами файлов, но несложно написать :получить дескриптор файла и вызвать fallocate()с соответствующими аргументами. Дополнительные сведения см. на справочной странице системного вызова fallocate:http://man7.org/linux/man-pages/man2/fallocate.2.html

.
-1
27.01.2020, 19:41

Теги

Похожие вопросы