인쇄되지 않는 문자를 고려한 텍스트 줄 바꿈

인쇄되지 않는 문자를 고려한 텍스트 줄 바꿈

이 문제특정 열에서 텍스트를 줄바꿈할지 묻는 질문에 사람들은 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 쉘에서 직접 테스트할 수 있습니다.

관련 정보