coreutils를 사용하여 텍스트 줄 바꿈 및 들여쓰기

coreutils를 사용하여 텍스트 줄 바꿈 및 들여쓰기

간결한 버전

다음과 비슷하게 여러 줄의 텍스트를 표 형식으로 표시하고 싶습니다.

all       Build all targets
document  Create documentation of source files in the subfolders
          `src` and `script`, and write it to `man`
test      Run unit tests

현재 이에 대한 내 입력은 다음과 같지만 물론 변경할 수 있습니다.

all---Build all targets
document---Create documentation of source files in the subfolders `src` and `script`, and write it to `man`
test---Run unit tests

이를 달성하기 위해 awk및 / 의 조합을 사용해 보았지만 줄이 끊어지는 동안 들여쓰기는 작동하지 않습니다. 이것이 나의 현재 접근 방식입니다.wrappr


| awk -F '---' "{ printf '%-10s %s\n', $1, $2 }" \
| fold -w $(($COLUMNS - 1)) -s

출력을 생성합니다

all       Build all targets
document  Create documentation of source files in the subfolders
`src` and `script`, and write it to `man`
test      Run unit tests

...즉, 세 번째 줄이 예상대로 들여쓰기되지 않았습니다.

주어진 줄 바꿈 길이와 주어진 들여쓰기 너비로 텍스트 서식을 지정하는 방법은 무엇입니까?— 텍스트의 다른 내용은 변경하지 않습니다. 보너스: UTF-8 및 이스케이프/제어 문자와 함께 작동해야 합니다.


배경 정보

만드는 것이 목표입니다자체 문서화 Makefile. 따라서 코드 형식화 및 표시를 위한 논리는 작고 독립적이어야 하며 별도로 설치된 소프트웨어에 의존하지 않아야 합니다. 이상적으로는 Makefile을 실행할 수 있는 모든 시스템에서 작동해야 하므로 coreutils에 대한 제한이 더 가깝습니다.

즉, 나는 다음을 groff사용하여 groff문제를 간단히 해결해 보았습니다.

이것원시 문자열나는 다음과 같이 구문 분석하고 형식을 지정하려고합니다.

## Build all targets
all: test document

## Run unit tests
test:
    ./run-tests .

## create documentation of source files in the subfolders `src` and `script`,
## and write it to `man`
document:
    ${MAKE} -C src document
    ${MAKE} -C script document

현재 이는 sed위에 게시된 형식 지정 코드에 주석을 제공하기 전에 여러 줄 주석을 무시하는 스크립트(자세한 내용은 링크 참조)를 사용하여 구문 분석됩니다.

답변1

접기 명령 후에 출력을 sed로 파이프하고 줄의 시작 부분을 탭으로 바꿉니다. 이전 "tabs" 명령을 사용하여 들여쓰기를 제어할 수 있습니다.

tabs 5
echo "A very long line that I want to fold on the word boundary and indent as well" | fold -s -w 20  | sed -e "s|^|\t|g"
     아주 긴 줄
     접고싶다
     이 단어에 대해서
     테두리 및 들여쓰기
     게다가

답변2

gnu awk를 사용하면 다음과 같은 간단한 작업을 수행할 수 있습니다.

awk -F '---' '
{ gsub(/.{50,60} /,"&\n           ",$2)
  printf "%-10s %s\n", $1, $2 }'

긴 단어를 처리하는 보다 정확한 장황한 버전의 경우:

awk -F '---' '
{ printf "%-10s ", $1
  n = split($2,x," ")
  len = 11
  for(i=1;i<=n;i++){
   if(len+length(x[i])>=80){printf "\n           "; len = 11}
   printf "%s ",x[i]
   len += 1+length(x[i])
  }
  printf "\n"
}'

답변3

다음은 접기를 사용한 다음 출력을 11칸만큼 이동하는 더 짧은 답변입니다. 무엇을 하는지 보려면 마지막 bash에 or 를 추가하세요 -v.-x

| sed 's:\(.*\)---\(.*\):printf "%-10s " "\1";fold -w '$(($COLUMNS - 11))' -s <<\\!|sed "1!s/^/           /"\n\2\n!\n:' | bash 

관련 정보