Вопрос по concatenation, bash, stdout – Конкатенация строк, файлов и вывод программы в Bash

16

Вариант использования - это, в моем случае, конкатенация CSS-файлов, прежде чем она будет минимизирована. Чтобы объединить два файла CSS:

cat 1.css 2.css > out.css

Чтобы добавить текст вone single положение, я могу сделать

cat 1.css <<SOMESTUFF 2.css > out.css
This will end in the middle.
SOMESTUFF

Чтобы добавить STDOUT изone другая программа:

sed 's/foo/bar/g' 3.css | cat 1.css - 2.css > out.css

Все идет нормально. Но я регулярно бываю в ситуациях, когда мне нужно смешиватьseveral строки, файлы и даже выходные данные программы, такие как заголовки авторских прав, файлы, предварительно обработанныеsed(1) и так далее. Я хотел бы объединить их вместе как можно меньшими шагами и временными файлами, имея при этом свободу выбора порядка.

Короче говоря, я ищу способ сделать это как можно быстрее в Bash:

command [string|file|output]+ > concatenated
# note the plus ;-) --------^

(В основном, имеяcat для обработки нескольких STDIN было бы достаточно, я думаю, как

<(echo "FOO") <(sed ...) <(echo "BAR") cat 1.css -echo1- -sed- 2.css -echo2-

Но я не вижу, как я могу получить к ним доступ.)

Ваш Ответ

3   ответа
25

Это работает:

cat 1.css <(echo "FOO") <(sed ...) 2.css <(echo "BAR")
Конечно, @Boldewyn должен быть добавлен> concatenated.css или же| compiler в конце для того, чтобы это работало для его проблемы как это:cat file1.css <(echo "FOO") <(command [string|file|output]) file2.css <(echo "BAR") > concatenated
D & APOS; о! Это самое простое решение (в моем случае), поэтому я приму это. Boldewyn
16

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

(
    cat 1.css
    echo "FOO"
    sed ...
    echo BAR
    cat 2.css
) > output

Вы также можете добавить в файл с>>, Например:

cat 1.css  >  output
echo "FOO" >> output
sed ...    >> output
echo "BAR" >> output 
cat 2.css  >> output

(Это потенциально открывает и закрывает файл несколько раз)

@ Лео, ты ошибаешься. Подстановка команд абсолютно указана в POSIX sh; увидетьpubs.opengroup.org/onlinepubs/9699919799/utilities/…
Вы можете использовать блок фигурных скобок, чтобы сделать то же самое.
Если я не ошибаюсь, () является POSIX-совместимым, тогда как подстановка команд - это расширение bash, которое не было реализовано в Cygwin Bash до 2008 года.
Благодарю. Да, это сделало бы, полностью пропустил этот вариант. +1. Boldewyn
13

Ты можешь сделать:

echo "$(command 1)" "$(command 2)" ... "$(command n)" > outputFile
@DennisWilliamson: Спасибо. Я исправил свой ответ.
Вам нужно процитировать эти подстановки команд, чтобы сохранить пробелы.

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