간결한 버전
다음과 비슷하게 여러 줄의 텍스트를 표 형식으로 표시하고 싶습니다.
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
및 / 의 조합을 사용해 보았지만 줄이 끊어지는 동안 들여쓰기는 작동하지 않습니다. 이것이 나의 현재 접근 방식입니다.wrap
pr
…
| 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