양쪽에 패딩을 사용하여 텍스트 중앙 정렬

양쪽에 패딩을 사용하여 텍스트 중앙 정렬

열 너비가 입력에서 가장 긴 줄이 되도록 텍스트를 중앙에 정렬하고 양쪽에 패딩을 정렬하는 쉬운 방법이 있습니까?

예를 들면 다음과 같습니다.

aaa
bbbb
c
ddddd
ee

다음과 같습니다(점은 공백을 나타냄).

.aaa.
bbbb.
..c..
ddddd
.ee..

어떤 도구라도 가능합니다. sed그것 awk또는 많은 coreutils도구 중 하나입니다.

편집하다: 출력 결과를 오해하신 분들도 계신 것 같습니다. 출력이 채워집니다.공간, 포인트가 아닙니다. 여기서는 더 명확하게 하기 위해 점을 사용하고 있습니다.

답변1

vim을 사용할 수 있습니다. 일반 모드에서:

:%center 5

...파일의 각 줄에 대해 작동하며(이 경우 의미 %) 최대 5자까지 묶습니다(vim 문서에서는 열이라고 함). 이것은 당신이 설명하는 것과 정확히 일치합니다. 파일에서 가장 긴 줄을 얻으려면(center 명령의 경우) wc -L file.txtvim에서 ;

:! 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

Python 사용:

#!/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.

관련 정보