Вставить тексты через чередующиеся строки

Ваше понимание в основном правильное, но есть пара дополнительных моментов, которые следует учитывать:

  1. «Двоичный» относится к чему-то, что не может быть прочитано человеком. Обычно это относится к машинному коду, но многие другие файлы также являются двоичными файлами в этом смысле, и большинство мультимедийных форматов являются хорошим примером. Однако FHS имеет более конкретное использование этого термина.
  2. Библиотеки могут представлять собой двоичный код. На самом деле, большая часть вещей в /libбудет библиотеками, скомпилированными в машинный код.
  3. Хотя такие вещи, как cat, используются в сценарии оболочки, например вызовы кода в библиотеках, они не являются библиотеками в смысле FHS, поскольку могут запускаться сами по себе.

В результате этих пунктов,более распространенная терминология среди людей, которые не пишут документы по стандартам,:

  • Объектные файлы :Они представляют собой машинный код, скомпилированный в собственном коде, но могут даже не запускаться и не вызываться. Обычно они имеют расширение .o, если они не попадают ни в одну из других категорий, и почти никогда не встречаются в большинстве систем, за исключением случаев создания программного обеспечения. Я перечислил их здесь, потому что они важны для понимания следующих вещей.

  • Исполняемые файлы :Это файлы, состоящие в основном из автономного кода, который можно запускать напрямую. Они могут быть либо специально отформатированными объектными файлами, которые могут быть загружены непосредственно ядром (такие вещи, как cat, bashи python, все это тип исполняемого файла ), либо интерпретируются какой-либо промежуточной программой. который сам по себе является исполняемым файлом (Minecraft, pydocи cowsay— все это примеры исполняемого файла этого типа ). Исполняемые файлы первого типа почти никогда не имеют расширения файла в системах UNIX, в то время как исполняемые файлы второго типа могут иметь или не иметь. Это то, что FHS называет «двоичными файлами». Они могут запускаться из других исполняемых файлов, но требуют вызова специальных функций для их вызова(fork()и exec()в C и C++, вещей из модуля subprocessв Python и т. д. )и выполняются как отдельный процесс.

  • Библиотеки :Это файлы, содержащие многократно используемый код, который может вызываться другой библиотекой или исполняемым файлом. Код в библиотеках вызывается (в основном )непосредственно другим кодом после загрузки библиотеки (упоминается как «связывание», когда речь идет о скомпилированном коде ), и выполняется в том же процессе, что и вызывающий его код. Существует три общих типа библиотек:

    1. Статические библиотеки :Это оригинальный вариант. Они состоят из архивного файла (обычно в формате AR )с большим количеством объектных файлов внутри, по одному для каждой функции в библиотеке.Объектные файлы связываются с исполняемым файлом, который их использует, поэтому исполняемый файл, использующий только статические библиотеки, практически на 100% независим от любого другого кода. В системах UNIX они обычно имеют расширение .a. Концепция статических библиотек на самом деле не существует вне скомпилированных языков программирования.
    2. Динамические библиотеки :Это наиболее распространенный тип библиотек, используемых сегодня. Динамическая библиотека — это специальный объектный файл, обычно с расширением .soв UNIX(.dll— это стандарт в Windows ), который загружается во время выполнения исполняемыми файлами, которые его используют. Большая часть того, что вы найдете в /libв производственных системах, — это динамические библиотеки.
    3. Модули :Это эквивалент динамической библиотеки для интерпретируемого языка. Обработка немного отличается от скомпилированного языка, и, в отличие от скомпилированного языка, файл может быть как модулем, так и исполняемым файлом (, см. пример http.serverв стандартной библиотеке Python )..
1
30.08.2019, 12:05
3 ответа

Вы можете использовать Awk, обрабатывая оба файла, сохраняя содержимое одного файла в системной памяти, а другое — по мере его повторения.

awk 'FNR==NR{ words[NR]=$0; next}{ if ($0 ~ /^#/) $0 = $0 words[++idx];  print }' rename main

Краткое объяснение того, как это работает

  • Часть FNR==NR{ words[NR]=$0; next}работает с первым файлом rename, индексируя содержимое вашего файла в массиве words. NR— это специальная переменная в Awk, которая отслеживает текущий номер строки. Таким образом, массив становится чем-то вродеwords['1']="yellow", words['2']="white"
  • Часть {..}теперь работает со следующим файлом rename, и если строка соответствует #, мы обновляем текущую строку $0, добавляя элемент из созданного массива.
  • Команда printпечатает строку со строкой, добавленной после #, для тех строк, которые начинаются с нее, и другие строки, такие как -.
2
27.01.2020, 23:22

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

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

Вот фрагмент скрипта:

FILE1=${1-data1}
shift
FILE2=${1-data2}
E="expected-output"

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input $FILE1 and $FILE2, columnized to save visual space:"
paste $FILE1 $FILE2 | expand -30

pl " Expected output:"
cat $E

rm -f t0
pl " Results, paste with double-space $FILE2, default options:"
# sed '/^$/d;G' $FILE2 > t0
paste -d '\n' - /dev/null < $FILE2 > t0
paste $FILE1 t0

pl " Results with paste of NUL, \0:"
paste -d'\0' $FILE1 t0

pl " Results with paste, process substitution:"
paste -d'\0' $FILE1 <( sed '/^$/d;G' $FILE2 )

производство:

 Input data1 and data2, columnized to save visual space:
#                             yellow
stars                         white
#                             green
twinkle                       red
#                             blue
on                            
#                             
the                           
#                             
sky                           

-----
 Expected output:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-----
 Results, paste with double-space data2, default options:
#       yellow
stars
#       white
twinkle
#       green
on
#       red
the
#       blue
sky

-----
 Results with paste of NUL, \0:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-----
 Results with paste, process substitution:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

ЭТО было сделано в такой системе, как:

OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23

ура, дрл

0
27.01.2020, 23:22

Это довольно легко сделать одним pasteвызовом

<main paste -d '\0\n' - rename -
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

Когда в списке разделителей, переданном в -d, pasteиспользуется несколько разделителей, последовательно используются эти разделители до тех пор, пока они не будут исчерпаны, а затем начинается с них снова. В приведенной выше команде переданы два разделителя:\0(пустая строка )и\n(новая строка ). Стандартный ввод указывает на файл main, который затем дважды упоминается внутри команды через два -,все это ведет к строке вывода, формируемой

  1. берет строку из mainи
  2. добавление к нему пустой строки
  3. взять следующую строку из renameи добавить ее к приведенной выше
  4. затем добавление новой строки к приведенному выше
  5. завершение цикла добавлением строки изmain

И так далее

1
27.01.2020, 23:22

Теги

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