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