Если sed (GNU) хорошо для Вас:
$ sed -i '1i #GPL License' file
В случае источника, являющегося файлом:
Исходные файлы:
$ cat file1
hi
hello
$ cat file2
welcome to
Unix SO.
Команда sed:
$ sed -i '1{
r file1
h;d
};2{H;g;}' file2
Вывод после команды sed:
$ cat file2
hi
hello
welcome to
Unix SO.
'r' команда sed не может считать файл перед 1-й строкой и следовательно этим решением. 1-я строка удерживается, содержат память, содержание file1 отправляется на терминал, затем когда вторая строка прибывает, это печатается вместе с 1-й строкой.
Что-то вроде этого должно сделать то, что Вы хотите:
for cmd in cat head tail; do
cmdLoc=$(type $cmd | awk '{print $3}')
eval "
$cmd() {
for fn in \"\$@\"; do
source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" |
$cmdLoc -
done
}
"
done
Можно уплотнить его как это:
for cmd in cat head tail; do
cmdLoc=$(type $cmd |& awk '{print $3}')
eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done
С вышеупомянутым в сценарии оболочки, названном tst_ccmds.bash
.
#!/bin/bash
for cmd in cat head tail; do
cmdLoc=$(type $cmd |& awk '{print $3}')
eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done
type cat
type head
type tail
Когда я выполняю это, я установил функции, как Вы попросили:
$ ./tst_ccmds.bash
cat ()
{
for fn in "$@";
do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /bin/cat - ;
done
}
head is a function
head ()
{
for fn in "$@";
do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/head - ;
done
}
tail is a function
tail ()
{
for fn in "$@";
do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/tail -;
done
}
Когда я использую эти функции в своей оболочке (source ./tst_ccmds.bash
) они работают следующим образом:
кошка
голова
хвост
простой текст
Самый большой прием, и я назвал бы это большим количеством взлома, использование тире (-
) как аргумент cat
, head
, и tail
через канал, который вынуждает их произвести содержание, которое прибыло из source-highlight
через STDIN канала. Этот бит:
...STDOUT -i "$fn" | /usr/bin/head - ....
Другой прием использует --failsafe
опция source-highlight
:
--failsafe
if no language definition is found for the input, it is simply
copied to the output
Это означает, что, если определение языка не найдено, оно действует как cat
, просто копируя его вход в стандартный вывод.
Эта функция перестанет работать если любой из head
,tail
или cat
псевдонимы потому что результат type
вызов не укажет на исполняемый файл. Если необходимо использовать эту функцию с псевдонимом (например, если Вы хотите использовать less
который требует -R
отметьте к colorize), необходимо будет удалить псевдоним и добавить искаженную команду отдельно:
less(){
for fn in "$@"; do
source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" |
/usr/bin/less -R || /usr/bin/less -R "$fn"; done
}
head
илиtail
на файлах это будет цветная кошка их и только работатьhead
если тип файла неизвестен. Я думаю, что OP хочет выполнить цветноеhead
,tail
и т.д. – terdon♦ 12.11.2013, 16:35tail
илиhead
. – slm♦ 12.11.2013, 16:52source-highlight --out-format=esc -o STDOUT -i "$fn" | $cmd || $cmd
. Я отредактировал бы, но я не был уверен, работает ли тот синтаксис. – terdon♦ 12.11.2013, 16:55.bashrc
Я думаю, что это будет одним из моего избранного! – terdon♦ 12.11.2013, 18:28