Bash: Добавить содержимое файлов к новому файлу с прокомментированной последней строкой в ​​каждом файле

Это зависит от конкретной make (1) , которая у вас есть, и используемого make-файла.

Например, GNU make предлагает набор правил и макросов по умолчанию. Т.е. макрос CC дает имя компилятора C, CXX - компилятора C ++; CFLAGS - это флаги для CC и CXXFLAGS для CXX.

Он также определяет множество правил по умолчанию, например, для создания foo.o из foo.c путем вызова $ (CC) $ (CFLAGS) - c foo.c и создайте исполняемый файл foo из foo.o , выполнив $ (CC) $ (CFLAGS) -o foo foo.o . Опять же, другие версии make могут определять другие макросы и правила по умолчанию (но CC и CFLAGS кажутся универсальными).

Если нет make-файла, GNU make использует вышеуказанные правила, и вы можете переопределить макросы, например, создание tst из tst.c с помощью:

make CC=clang CFLAGS='-O2 -g -Wall' tst

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

Если есть make-файл (может иметь несколько разных имен, проверьте руководство; по крайней мере make-файл и Makefile ), макроопределения и правила, которые он определяет. Большинство make-файлов этого не делают, так что вам не повредит приведенная выше команда. Но никаких гарантий нет. Проверьте наличие каких-либо инструкций в файлах, которые обычно называются INSTALL, README или другими вариантами, или в самом файле makefile.

И, наконец, есть несколько альтернатив, которые можно сделать (их управляющие файлы по умолчанию обычно называются некоторыми вариациями makefile ), но поскольку make (1) почти универсален, их использование должно быть где-то задокументировано.

0
06.02.2019, 20:27
2 ответа

Последняя строка вашего файла не заканчивается новой строкой. Вот почему последняя строка одного файла объединяется с первой строкой следующего файла.

Вы можете попробовать добавить новую строку после каждого файла с помощью этого

for file in static/js/*.js
do
    cat "$file"
    echo
done >> main.js

Сценарий не проверяет, заканчивается ли файл новой строкой или нет. Если файл заканчивается символом новой строки, за ним следует пустая строка.

5
28.01.2020, 02:13

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

.
sed ';' static/js/*.js >main.js

Он будет работать с GNU sed; Я не уверен в других реализациях.

Пример:

$ printf '%s' line1 >file1
$ printf '%s\n' line2 >file2
$ printf '%s' line3 >file3

$ cat file*
line1line2
line3

$ sed ';' file*
line1
line2
line3

Это происходит потому, что цитируя документацию GNU sed:

Actually, if sed prints a line without the terminating newline, it will nevertheless print the missing newline as soon as more text is sent to the same output stream, which gives the “least expected surprise” even though it does not make commands like ‘sed -n p’ exactly identical to cat.

Приведенная выше команда даст тот же результат, что и:

for file in static/js/*.js; do
    cat "$file"
    # Dump the last byte of each file and check if it is a
    # newline (hex encoding 0a); print a newline if it is not
    [ '0a' = "$(tail -c 1 "$file" | od -A n -t x1 | tr -d ' ')" ] || printf '\n'
done > main.js

за исключением последней строки:sed ';'не будет добавлять <newline>после последнего файла, если он отсутствует, в то время как этот цикл будет.

3
28.01.2020, 02:13

Теги

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