이 문제특정 열에서 텍스트를 줄바꿈할지 묻는 질문에 사람들은 fold
또는 사용을 제안했지만 fmt
내가 아는 한 이것은 문자만 계산하고 인쇄할 수 없는 문자는 허용하지 않습니다. 예를 들어:
fold -w 20 -s <<<`seq 1 25`
예상대로 다음과 같은 결과가 나옵니다.
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15
16 17 18 19 20 21
22 23 24 25
하지만:
fold -w 20 -s <<<^[[32m`seq 1 25`^[[m
( ^[
이스케이프 문자가 있는 곳)은 녹색 텍스트로 동일한 내용을 직관적으로 생성해야 하지만 대신 다음을 생성합니다.
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20
21 22 23 24 25
녹색 텍스트로 표시됩니다.
인쇄되지 않는 문자를 고려하라는 스위치가 표시되지 않습니다.인쇄되지 않는 문자를 표시하는 PS1 방법fold
또는 와 함께 작동하지 않는 것 같습니다 fmt
.
인쇄할 수 없는 문자를 고려하면서 텍스트를 래핑할 수 있는 것(가급적 표준)이 있습니까?
편집하다:
위의 예는 실제로 문제를 단순화하고 설명하기 위한 것이지만 지나치게 단순화했을 수도 있습니다. 실제 예를 명확히 하기 위해 일부 단어에 색상이 지정된 텍스트가 있고(ANSI 이스케이프 시퀀스 사용) 깔끔하게 래핑하고 싶습니다. 예를 들어:
Here is some example text that contains ^[[31mred^[[m and ^[[32mgreen^[[m words that I would like to wrap neatly.
^[
이스케이프 문자는 어디에 있습니까?
20개 열로 줄 바꿈하려면 다음을 기대합니다.
Here is some
example text that
contains red and
green words that
I would like to
wrap neatly.
(색상은 "빨간색"과 "녹색"입니다.) 그러나 ANSI 이스케이프 코드로 인해 다음과 같이 래핑됩니다.
Here is some
example text
that contains
red and
green words
that I would like
to wrap neatly.
답변1
ANSI 이스케이프 시퀀스는 파이프가 아닌 셸에 의해 해석됩니다. 따라서 실제로 ^[[32m
시퀀스 출력과 함께 접기 명령에 텍스트를 삽입하는 것입니다. 전체 텍스트를 녹색으로 바꾸려면 다음과 같이 시도해 볼 수 있습니다.
echo -e "\e[32m"$(seq 1 25 | fold -w 20 -s)"\e[m"
또는
echo -e "\e[32m"; seq -s ' ' 1 25 | fold -w 20 -s; echo -e "\e[m"
이스케이프 문자로 사용하고 있습니다 \e
. 이는 bash 쉘에서 직접 테스트할 수 있습니다.