파일의 행을 선택적으로 수정하는 방법(수정은 행을 개별적으로 분석하는 대신 전체를 선택하는 방식)

파일의 행을 선택적으로 수정하는 방법(수정은 행을 개별적으로 분석하는 대신 전체를 선택하는 방식)

긴 이야기 짧게주석을 무시하면서 fstab의 항목 열을 정렬해야 합니다.

/dev/foo              /foo         ext4        defaults   0    2
# comment line 1
/dev/bar /bar ext4 defaults 0 2
# comment line 2
UUID=1234567890     /baz      ext4      defaults   0       2

되어야 한다

/dev/foo         /foo  ext4  defaults  0  2
# comment line 1
/dev/bar         /bar  ext4  defaults  0  2
# comment line 2
UUID=1234567890  /baz  ext4  defaults  0  2

이상적으로는 다이빙 명령만 필요합니다.

</tldr>

내 문서 fstab는 주석 줄로 된 문서의 큰 덩어리로 구성되어 있으며 필드 설명으로 끝나고 마지막으로 항목이 있습니다. 입력 섹션에는 주석 줄이 산재해 있습니다.

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>

# table entries begin ...

column -t명령이나 이에 상응하는 명령을 사용하여 입력 행의 열을 정렬 하고 싶지만 주석을 무시하고 싶습니다. 주석 줄을 무시하지 않으면 정렬됩니다. vim에서 파일을 편집할 때 첫 번째 항목으로 시작하는 줄을 시각적으로 선택하고 실행할 수 있지만 '<,'> !grep '^[^\#]' | column -tgrep은 주석 줄을 필터링하므로 출력에 표시되지 않으므로 vim의 선택 항목이 대체됩니다. column작동하지 않기 때문에 일치하는 각 행에 대해 개별적으로 열 명령을 실행할 수 없습니다 .

이 작업을 수행할 수 있는 간단한 명령이 있습니까? 내부의 외부 명령에 간단히 위임할 수 있으므로 vim에서 구현할 필요가 없습니다.

답변1

tr -s \[:blank:] \  </etc/fstab |       # squeeze all tabs/spaces to 1 space
sed 's/^#/ # # # # # #/'        |       # create 6 tiny comment fields
column -t                       |       # get columns
sed '/^\( *#\)\{6\}/{s//#/;s/  */ /g;}' # fix and squeeze spaces for comments

관련 정보