При печати текстового файла разрыв строки после последней строки - сбивает с толку из-за отсутствия пробела между последней строкой и $ USER - PullRequest
0 голосов
/ 23 марта 2020

В целях отладки я печатал последние 2 строки файла txt из терминала, что дает следующее. Я хотел проверить последнюю строку по существу. Я получил следующее.

(base) user$ tail -2 ./file.txt
HWI-ST1410:141:C4WJLACXX:4:1201:18182:26815 +   7B  17611409    GTCGTTGTAGTATAGTGGTAAGTATTCCCGCCT
HW(base) user$ 

Несмотря на то, что последняя строка некоторое время была просто HW, я думал, что это была более длинная строка выше, так как последняя строка была напечатана вместе с (base) user$ следующим образом: HW(base) user$

Как я могу убедиться, что после последней строки файла txt, который я печатаю, будет разрыв строки, т.е. я хочу, чтобы вывод был таким:

(base) user$ tail -2 ./file.txt
    HWI-ST1410:141:C4WJLACXX:4:1201:18182:26815 +   7B  17611409    GTCGTTGTAGTATAGTGGTAAGTATTCCCGCCT
    HW
(base) user$

1 Ответ

0 голосов
/ 24 марта 2020

У меня есть это в моем .bashrc:

__PROMPT_NEWLINE=$'\nV '
__set_missing_newline_fix()
{
       local CURPOS
       echo -en "\E[6n" # ANSI DSR
       read -sdR CURPOS
       CURPOS=${CURPOS#*;}
       if [ $CURPOS -eq 1 ]; then
               __MISSING_NEWLINE_FIX=""
       else
               __MISSING_NEWLINE_FIX="$__PROMPT_NEWLINE"
       fi
}

__set_prompt()
{
       ...
       __set_missing_newline_fix
       ...
}
PROMPT_COMMAND=__set_prompt

PS1="\${__MISSING_NEWLINE_FIX}...rest of the prompt..."

Результат, в вашем случае, будет:

(base) user$ tail -2 ./file.txt
HWI-ST1410:141:C4WJLACXX:4:1201:18182:26815 +   7B  17611409    GTCGTTGTAGTATAGTGGTAAGTATTCCCGCCT
HW
V (base) user$ 

Что он делает, это запросить терминал на время создания подсказки ((base) user$ в вашем случае). Если курсор находится не в первом столбце, он начнет новую строку и добавит V к приглашению (отсюда значение __PROMPT_NEWLINE).

ANSI DSR равно Состояние устройства Отчет :

CSI 6n | DSR | Отчет о состоянии устройства | Сообщает приложению позицию курсора (как будто набрано на клавиатуре) ESC[n;mR, где n - строка, а m - столбец.)

Итак, выполнив echo -en "\E[6n" сразу после read -sdR CURPOS (молча читается с символом R в качестве разделителя), мы получаем значение ESC[n;m.

CURPOS=${CURPOS#*;} удаляет все до точки с запятой (;), что по существу извлекает m, номер столбца.

И, наконец, если столбец не 1, то мы знаем, что нам нужно исправить запрос, добавив __MISSING_NEWLINE_FIX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...