텍스트 편집기로 /etc/fstab을 편집하면 모든 공백이 잘못 정렬됩니다. 파일을 살펴보고 공백을 삽입/제거하여 모든 항목을 정렬할 수 있지만 보다 자동화된 솔루션을 찾고 있습니다. 이상적으로는 fstab을 넣고 모든 것을 "예쁘게" 정렬할 수 있는 온라인 자바스크립트 페이지가 있어야 합니다. 그런 다음 최종 결과를 다시 파일에 복사하여 붙여넣을 수 있습니다.
유사하거나 더 나은 솔루션이 있습니까?
편집:
저는 데스크탑에서 Linux를 사용하고 있으며 단지 fstab을 편집하기 위해 vi나 emacs를 추가할 생각은 없습니다. 어떤 사람들에게는 Emacs가 더 나은 솔루션일 수 있지만 다른 사람들에게는 더 나은 솔루션이 아닙니다.
EDIT2:
다음은 탭 fstab을 사용하는 샘플 조각입니다. 열이 잘못 정렬되었습니다.
proc /proc proc nodev,noexec,nosuid 0 0
/dev/disk/by-label/Linux / ext4 errors=remount-ro 0 1
/dev/disk/by-label/Home /home ext4 defaults 0 0
공백으로 자동 형식을 지정하고 아래와 같이 보이도록 하고 싶습니다.
proc /proc proc nodev,noexec,nosuid 0 0
/dev/disk/by-label/Linux / ext4 errors=remount-ro 0 1
/dev/disk/by-label/Home /home ext4 defaults 0 0
답변1
나는 열을 멋진 테이블에 정렬하는 column
옵션과 함께 명령을 사용하는 것을 좋아합니다.-t
column -t /etc/fstab
proc /proc proc nodev,noexec,nosuid 0 0
/dev/disk/by-label/Linux / ext4 errors=remount-ro 0 1
/dev/disk/by-label/Home /home ext4 defaults 0 0
답변2
#!/bin/bash
# usage: fstabalign [FILE]
# This script will output fstab or other file as column aligned.
# It will not alter blank lines or #hash comments.
if [ -z "$1" ]; then
FILE=$(cat /etc/fstab)
else
FILE=$(cat "$1")
fi
# Separate the file contents into aligned and unaligned parts.
OUT_ALIGNED=$(echo "$FILE" | sed 's/^\s*#.*//' | nl -ba | column -t)
OUT_UNALIGNED=$(echo "$FILE" | sed 's/^\s*[^#].*//' $src | nl -ba)
# Remerge aligned and unaligned parts.
while read; do
line_aligned="$REPLY"
read -u 3; line_unaligned="$REPLY"
line_aligned=$( echo "$line_aligned" | sed 's/\s*[0-9]*\s*//')
line_unaligned=$(echo "$line_unaligned" | sed 's/\s*[0-9]*\s*//')
echo "$line_aligned$line_unaligned"
done < <(echo "$OUT_ALIGNED") 3< <(echo "$OUT_UNALIGNED")
답변3
편집하다:
아, 난 당신을 눈치채지 못했어요빔 없음지금까지 편집중입니다.
또 다른 방법은 이와 같은 것을 스크립트에 넣는 것입니다.
문제는 다음과 같습니다.
- 항목만 추출하고 주석이 있는 곳에는 빈 줄을 남겨 둡니다.
- 이것을 파이프
column
하고-e
빈 줄을 보존하는 데 사용하고 임시 파일 1에 저장합니다. - 2. 댓글을 추출하여 임시파일에 저장합니다.
paste
파일을 병합하여-d'\0'
선행 공백을 버리려면 with를 사용하십시오.
파일에 저장 chmod +x script_file
하고 선택적으로 파일을 ./script_file
지정할 수 있습니다 .fstab
./script_file /path/to/fstab/file
괜찮아 보이는데? 그 다음에./script_file > /etc/fstab
#!/bin/bash
src="/etc/fstab"
[[ "$1" ]] && src="$1"
[[ -r "$src" ]] || exit 1
tmp1="$(mktemp)" || exit 1
tmp2="$(mktemp)" || exit 1
# Filter out comments and pipe them through column with -e
# Save to tmp1
sed 's/^[ \t]*#.*//' "$src" | column -et > "$tmp1"
# Filter out tab lines and save to tmp2
sed 's/^[ \t]*[^#].*//' "$src" > "$tmp2"
# merge
paste -d'\0' "$tmp1" "$tmp2"
rm "$tmp1" "$tmp2"
윔:
Vim 스크립트를 사용할 수 있습니다. 비슷한 내용을 다시 쓴 글입니다...
- 새 명령 추가
:FmtFstab
- 주석 줄은 다음으로 시작합니다.마법
#=
포맷도 했습니다. (따라서 fstab 줄을 주석 처리하고 포맷하고 싶다면#=
줄 시작 부분에 사용하세요.아니요입장 후 공백이 있습니다#=
! ).
로드된 스크립트 파일에 추가하거나 다음을 통해 수동으로 로드하세요.
:so file_name.vim
Vim에서 파일을 열 때 라고 말하면 :FmtFstab
포맷됩니다. 또한 이에 따라 제목의 형식을 지정하십시오.
(관심이 있으신 경우 UUID를 삽입하거나 나열하는 스크립트도 있습니다.)
" Split string by pattern
" Return array/List in form : [ length, [len_match1, len_match2, ...] ]
fun! s:StrSplit2Widths(line, pat)
let lst=split(a:line, a:pat)
call map(lst, 'strlen(v:val)')
return [len(lst), lst]
endfun
" Generate a string based on a "widths" list
" @widths: widths to use for each entry in list (format as from
" s:StrSplit2Widths)
" @lst : list with text to be printed according to widths
fun! s:WidthFmtList(widths, lst)
let i = len(a:lst) - 1
let lif=""
while i >= 0
let lif = printf("%-*s", a:widths[1][i], a:lst[i]) . " " . lif
let i = i - 1
endwhile
return lif
endfun
" Format current line according to widths
fun! s:FmtBufLine(widths)
let lst=split(getline("."), '\s\+')
if a:widths[0] != len(lst)
return
endif
let lif = s:WidthFmtList(a:widths, lst)
call setline(line("."), lif)
endfun
fun! <SID>:FormatFstab(...)
" Comments to include
let incmagic = "#="
" Header
let hdr = "# <file system> <mount point> <type> <options> <dump> <pass>"
" Base widths are based on header
let widths = s:StrSplit2Widths(hdr, '>\zs\s*\ze<')
" Get all lines (this can be expanded to only do ranges)
let lines = getline(1, line("$"))
" Remove all lines not matching pattern
call filter(lines, 'v:val =~ "^\\s*\\([^#]\\|' . incmagic . '\\)"')
" Calculate width for each column
for line in lines
let lw = s:StrSplit2Widths(line, '\s\+')
while lw[0] < widths[0]
call add(lw[1], 0)
let lw[0] = lw[0] + 1
endwhile
call map(widths[1], 'lw[1][v:key] > v:val ? lw[1][v:key] : v:val')
endfor
" Format each line matching pattern
silent exec ':g/^\s*\(' . incmagic . '\|[^#]\)/ call s:FmtBufLine(widths)'
" Format header
let hlst = split(hdr, '>\zs\s*\ze<')
silent :%s/^\s*#\s*<file system>.*/\=s:WidthFmtList(widths, hlst)
endfun
" ex command
command! -nargs=0 -bar FmtFstab call <SID>:FormatFstab()
답변4
Vim이나 emacs가 작동해야 합니다. 도대체 nano라도 fstab을 올바르게 표시해야 합니다. 텍스트 편집기 GUI를 사용하려면 gedit를 사용해 볼 수 있습니다. fstab을 온라인 편집기에 넣고 싶다면 Google 문서를 사용하고 다시 복사하여 붙여넣을 수 있습니다.
단일 공백이 아닌 탭을 사용하여 fstabs를 구분해야 합니다. 특히 동시에 두 가지를 모두 사용하는 경우 이로 인해 불일치가 발생할 수 있습니다.
쉘 창이 한 줄의 전체 텍스트를 담을 만큼 충분히 크지 않기 때문에 이상하게 보일 수 있습니다.