
열 너비가 입력에서 가장 긴 줄을 사용하여 양쪽에 패딩을 사용하여 텍스트를 중앙에 정렬하는 쉬운 방법이 있습니까?
예를 들면 다음과 같습니다.
aaa
bbbb
c
ddddd
ee
다음과 같이 변합니다(점은 공백을 나타냄).
.aaa.
bbbb.
..c..
ddddd
.ee..
어떤 도구라도 괜찮습니다. 그것이 sed
거나 awk
또는 많은 coreutils
도구가 될 수 있습니다.
편집하다: 출력 결과를 오해하신 분들도 계신 것 같습니다. 출력은 다음과 같이 채워집니다.공백, 점이 아닙니다. 여기서는 좀 더 명확하게 하기 위해 점을 사용했습니다.
답변1
나는 vim을 사용할 것이다. 일반 모드에서:
:%center 5
...파일의 모든 줄(이 경우에는 의 의미 %
)에 대해 작동하며 5자를 중심으로 합니다(vim 문서에서는 열이라고 함). 이것은 설명대로 정확하게 작동합니다. 파일에서 가장 긴 줄을 얻으려면(center 명령에 사용하기 위해) wc -L file.txt
; 또는 vim 내에서:
:! wc -L %
불행히도 이것은 바닐라 vi에서는 사용할 수 없지만 'linux'라는 태그가 지정되어 있으므로 최소한 저장소에 vim이 있을 가능성이 높습니다.
다음을 사용하여 한 줄로 이 작업을 수행할 수도 있습니다.
vim file.txt -c '%center 5' -c 'wq' &> /dev/null
...하지만 그것이 작업을 수행하는 가장 빠른 방법은 아니라고 확신합니다.
답변2
awk로 할 수 있는 한 가지 방법은 다음과 같습니다(pad.awk):
# Determine length of longest line
FNR == NR { if(length > M) M = length; next }
# Pad each line according current line length (L) and longest line (M)
{
L = M - length;
for(i=1; i<=int(L/2); i++)
printf "."
printf "%s", $0
for(i=1; i<=int(L/2+.5); i++)
printf "."
printf "\n"
}
다음과 같이 실행하세요:
awk -f pad.awk infile infile
산출:
.aaa.
bbbb.
..c..
ddddd
.ee..
GNU wc를 사용할 수 있는 경우 를 사용하면 가장 긴 줄을 더 효율적으로 찾을 수 있습니다 wc -L
. 즉, 첫 번째 줄을 삭제합니다.pad.awk다음과 같이 awk를 실행하세요.
awk -f pad.awk M=$(wc -L < infile) infile
###업데이트
공백이 채워진 문자열에 대해 조금 놓쳤습니다. 어쨌든 가변 패딩 문자를 허용하는 것은 매우 간단합니다. 다음은 위의 아이디어를 기반으로 한 완전한 예입니다.
# Set padding character to the default (" ") if it was not set with -v
# Set ORS to "" to make printing easier
BEGIN { if(D == "") D = " "; ORS = "" }
# Pad each line according current line length (L) and longest line (M)
{
L = M - length;
for(i=1; i<=int(L/2); i++)
print D
print $0
for(i=1; i<=int(L/2+.5); i++)
print D
print "\n"
}
예:
awk -v M=$(wc -L < infile) -v D=_ -f pad.awk infile
산출:
_aaa_
bbbb_
__c__
ddddd
_ee__
답변3
내 솔루션은 다음과 같습니다.Thor의 답변에 대한 의견:
awk -v M="`wc -L file`" '{ printf "%*s%*s", (M+length)/2, $0, (M-length+1)/2+1, "\n" }' < file
문제가 우아하고 간결하게 해결된 것 같아서 답변으로 다시 게시합니다.
답변4
파이썬으로:
#!/usr/bin/env python
with open('input.txt') as file:
for line in file:
l = line.strip()
print l.center(5,'.'),"\n",
참고: 2.7 이하의 Python 이전 버전을 사용하는 경우에는 작동하지 않습니다.
동일한 출력 :
rahul@home-pc:~/work$ python format_center.py
.aaa.
.bbbb
..c..
ddddd
..ee.