如何轻松对齐 fstab 条目

如何轻松对齐 fstab 条目

使用文本编辑器编辑 /etc/fstab 会使所有间距不对齐。我可以浏览文件并插入/删除空格来排列所有内容,但我正在寻找更自动化的解决方案。理想情况下,应该有一个在线 javascript 页面,我可以将 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

编辑:

啊,没注意到你的没有 Vim编辑到现在。

另一种方法是将类似的内容放入脚本中。

事情是这样的:

  1. 仅提取条目,在注释处保留空行。
  2. 将其通过管道传输column并用于-e保留空行,保存到临时文件 1。
  3. 提取注释,保存到临时文件2。
  4. paste使用with合并文件-d'\0'以丢弃开头的空格。

保存到文件,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 文档(然后复制粘贴回来)。

确保您使用制表符来分隔 fstab,而不是单个空格。这可能会导致不一致,尤其是当您同时使用两者时。

它可能看起来很时髦,因为 shell 窗口不够大,无法容纳该行中的整个文本。

相关内容