코드를 열로 형식화하는 스크립트

코드를 열로 형식화하는 스크립트

종종 왼쪽 자동 들여쓰기가 아닌 비슷한 줄 구조를 기반으로 코드를 정렬하고 싶습니다. 이런 일을 할 수 있는 스크립트가 있나요? 다음은 제가 하고 싶은 작업의 예입니다. 반면:

            self.colorOfBackground =? colorOfBackground
            self.colorOfLineForTime =? colorOfLineForTime
            self.marginOnBottom =? marginOnBottom
            self.marginOnTop =? marginOnTop
            ...

스크립트를 실행하고 탭의 각 "열"을 정렬하여 정렬하고 시각적으로 더 쉽게 구문 분석하고 싶습니다.

            self.colorOfBackground     =?    colorOfBackground
            self.colorOfLineForTime    =?    colorOfLineForTime
            self.marginOnBottom        =?    marginOnBottom
            self.marginOnTop           =?    marginOnTop
            ...

나는 Perl이나 Python, AWK 또는 다른 스크립트 언어가 이것을 할 수 있다고 생각했지만 아쉽게도 나는 이것들에 대해 많이 알지 못합니다. 지금까지 저는 Vim과 Vim의 정규식 기반 대체 기능을 사용해왔지만 여전히 대부분의 시간을 수동으로 열 간격을 지정하는 데 보냅니다.

답변1

이렇게 하면 예상된 결과를 얻을 수 있습니다.

파일.txt:

self.colorOfBackground =? colorOfBackground
self.colorOfLineForTime =? colorOfLineForTime
self.marginOnBottom =? marginOnBottom
self.marginOnTop =? marginOnTop

다음 명령을 사용하는 경우:

sed 's/^[[:blank:]]*//' File.txt | column -t -s "  "

이 명령은 선행 공백을 제거합니다. sed 's/^[[:blank:]]*//'이 스택 오버플로 질문을 참조하면 이 명령이 실제로 스택 오버플로에서 수행하는 작업을 예제와 함께 자세히 설명합니다.여기를 클릭하세요

통사론: column -t [-s separator] [filename] -> column -t -s " "

-t: 내용을 테이블 형식으로 표시하기 위한 매개변수

-s : 특정 구분 기호를 기준으로 콘텐츠를 구분합니다.

명령 출력:

self.colorOfBackground   =?  colorOfBackground
self.colorOfLineForTime  =?  colorOfLineForTime
self.marginOnBottom      =?  marginOnBottom
self.marginOnTop         =?  marginOnTop

위 명령을 사용하여 사용한 데이터를 정렬하기 전에 파일의 전체 데이터를 왼쪽으로 정렬해야 합니다.sed 's/^[[:blank:]]*//'

답변2

답변을 수락했더라도 명령 에 연결하지 않고도 awk또는 sed명령을 사용하여 원하는 결과를 얻을 수 있습니다.column

awk '{print $1"\t\t"$2"\t\t"$3}' column.txt

sed -e 's/^[[:blank:]]*//' -e 's|\s|\t\t|g' column.txt

sed명령은 먼저 각 줄의 시작 부분에서 모든 공백을 제거한 다음 나머지 공백을 두 개의 탭으로 변환합니다. 다음과 같은 출력이 제공됩니다.

self.colorOfBackground          =?              colorOfBackground
self.colorOfLineForTime         =?              colorOfLineForTime
self.marginOnBottom             =?              marginOnBottom
self.marginOnTop                =?              marginOnTop

awk명령은 첫 번째 열, 즉 로 시작하는 문자열 self, 두 개의 탭, 두 번째 열, 즉 =?다른 두 개의 탭, 마지막으로 세 번째 열의 문자열만 인쇄합니다.

self.colorOfBackground          =?      colorOfBackground
self.colorOfLineForTime         =?      colorOfLineForTime
self.marginOnBottom             =?      marginOnBottom
self.marginOnTop                =?      marginOnTop

파일을 표준 출력으로 보내는 대신 파일 자체를 편집하려면 다음 명령 중 하나를 사용하십시오.

sed -i -e 's/^[[:blank:]]*//' -e 's|\s|\t\t|g' column.txt 

awk -i inplace '{print $1"\t\t"$2"\t\t"$3}' column.txt

이 명령을 실행하려면 스위치를 awk사용하려면 버전 4.2 이상이 필요합니다 .-i inplace

답변3

필요한 것은 다음과 같습니다.

$ column -t file
self.colorOfBackground   =?  colorOfBackground
self.colorOfLineForTime  =?  colorOfLineForTime
self.marginOnBottom      =?  marginOnBottom
self.marginOnTop         =?  marginOnTop

또는 원하는 경우:

$ column -t -o'    ' file
self.colorOfBackground     =?    colorOfBackground
self.colorOfLineForTime    =?    colorOfLineForTime
self.marginOnBottom        =?    marginOnBottom
self.marginOnTop           =?    marginOnTop

$ column -t -o$'\t' file
self.colorOfBackground  =?      colorOfBackground
self.colorOfLineForTime =?      colorOfLineForTime
self.marginOnBottom     =?      marginOnBottom
self.marginOnTop        =?      marginOnTop

$ column -t -o$'\t\t' file
self.colorOfBackground          =?              colorOfBackground
self.colorOfLineForTime         =?              colorOfLineForTime
self.marginOnBottom             =?              marginOnBottom
self.marginOnTop                =?              marginOnTop

column인수를 적절하게 조정합니다 .

관련 정보