Скопировать файл с измененным содержимым

Краткий ответ
  • Да вы можете поместить переменную LESS_TERMCAP_meв файл lesskey, но для этого потребуется исправить исходный код и создать собственную lessверсию (Я объясню это ниже ).

  • Нет файл lesskeyне может содержать внешние команды, поскольку tputстановится независимым от терминала -. Однако вы можете использовать несколько файлов lesskeyв соответствии с рекомендациями ответа Томаса Дики .

lesskeyфайл

Командаlesskeyиспользуется для преобразования человеческого -читаемого текстового содержимого в двоичный файл конфигурации для команды less. Этот файл конфигурации называетсяlesskeyфайл и обычно называется файлом ~/.less.

Этот файл содержит три раздела:

  1. Команда(например.:q quit)
  2. Редактирование строки(например.^G abort)
  3. lessпеременные окружения(например.LESS_TERMCAP_me = \033(B\033[m)

Поместить переменные LESS_TERMCAP_*в файл lesskey

$ cat > lesskey.txt << EOF
#env
LESS = -iSrsM +Gg
LESS_TERMCAP_md = $(tput bold; tput setaf 6)
LESS_TERMCAP_me = $(tput sgr0)
LESS_TERMCAP_so = $(tput bold; tput setaf 3; tput setab 4)
LESS_TERMCAP_se = $(tput rmso; tput sgr0)
LESS_TERMCAP_us = $(tput smul; tput bold; tput setaf 7)
LESS_TERMCAP_ue = $(tput rmul; tput sgr0)
LESS_TERMCAP_mr = $(tput rev)
LESS_TERMCAP_mh = $(tput dim)
EOF

$ lesskey lesskey.txt  # By default lesskey writes ~/.less

$ man bash             # By default man uses less (pager)

Ошибка

Команда lessсчитывает конфигурацию ~/.lessслишком поздно:
сразу после поиска переменных LESS_TERMCAP_*.

Эта ошибка затрагивает версию 487 , выпущенную 29 марта 2017 г. (и, безусловно, предыдущие версии ).

Я только что отправил сообщение об ошибке и соответствующее исправление сопровождающим. Я обновлю этот ответ, когда исправление будет применено к следующему выпуску less...

Почини сам

  1. Скачать архив с исходным кодом из:

  2. Инвертировать две строки в файле main.cв строке 113
    До:

    /*
     * Process command line arguments and LESS environment arguments.
     * Command line arguments override environment arguments.
     */
    is_tty = isatty(1);
    get_term();
    init_cmds();
    init_charset();
    init_line();
    

    После:

    /*
     * Process command line arguments and LESS environment arguments.
     * Command line arguments override environment arguments.
     */
    is_tty = isatty(1);
    init_cmds();         /* Load lesskey file before */ 
    get_term();          /* getting variables LESS_TERMCAP_* */
    init_charset();
    init_line();
    
  3. Установите зависимости, необходимые для сборки

    ./configure
    

    Если ./configureне удается, определите отсутствующие зависимости.
    В моем случае я установил ncurses-develдля получения заголовка term.h.

  4. Сборка

    make 
    
  5. Сохраните свой собственный -скомпилированный lessгде-нибудь, например, в личном каталоге~/bin

    mkdir -p ~/bin
    cp./less ~/bin
    PATH="$PATH:~/bin"
    

    Не забудьте установить переменную окружения PATHв свой ~/.profileили, если вы предпочитаете любой другой файл, как ~/.bashrc, ~/.login...

Дополнительные советы

  • См. TERMCAPS, используемый на странице man -

    LESS_TERMCAP_DEBUG=1 man bash
    
  • Получить man-страницу -с кодировкой TERMCAPS

    MANPAGER='tee man.txt' man bash
    
  • Объедините эти два совета

    MANPAGER='tee man.txt' man bash
    LESS_TERMCAP_DEBUG=1 less man.txt
    
1
12.07.2019, 13:52
1 ответ

Трубка тут вообще ни при чем. cpне имеет выходных данных, поэтому вы не можете направить его выходные данные в другую программу. Я предполагаю, что вы хотели ;или &&вместо:

## copy the file and then run sed
cp file.txt file.txt.bak; sed -i '1i#Backup file' file.txt.bak

Или

## copy the file and then run sed BUT only if the copy was successfull
cp file.txt file.txt.bak && sed -i '1i#Backup file' file.txt.bak

Однако, если все, что вам нужно, это копия исходного файла с измененной первой строкой, то sed действительно может сделать это за вас:

sed  '1i#Backup file' file.txt > file.txt.bak
2
27.01.2020, 23:30

Теги

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