Как может я голова colorize, хвост и меньше, то же, поскольку я сделал с кошкой?

Если 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-й строкой.

5
13.04.2017, 15:36
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 ss

голова

head ss

хвост

tail ss

простой текст

txt ss

Каков прием?

Самый большой прием, и я назвал бы это большим количеством взлома, использование тире (-) как аргумент 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
}
3
27.01.2020, 20:41
  • 1
    +1 для функции как переменный прием, но это не будет работать head или tail на файлах это будет цветная кошка их и только работать head если тип файла неизвестен. Я думаю, что OP хочет выполнить цветное head, tail и т.д. –  terdon♦ 12.11.2013, 16:35
  • 2
    @terdon - ах, благодарит указать на это. Вы думаете, что он хочет возглавить/выследить вывод исходного выделения? Это, кажется, работает при передаче по каналу его к tail или head. –  slm♦ 12.11.2013, 16:52
  • 3
    да, это - то, что я понял. Что-то как source-highlight --out-format=esc -o STDOUT -i "$fn" | $cmd || $cmd. Я отредактировал бы, но я не был уверен, работает ли тот синтаксис. –  terdon♦ 12.11.2013, 16:55
  • 4
    @terdon - можно ли проверить мои изменения дважды? Кажется, работает теперь. –  slm♦ 12.11.2013, 17:12
  • 5
    Хорошо работает здесь, добавленный к моему .bashrc Я думаю, что это будет одним из моего избранного! –  terdon♦ 12.11.2013, 18:28

Теги

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