使用文本编辑器编辑 /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编辑到现在。
另一种方法是将类似的内容放入脚本中。
事情是这样的:
- 仅提取条目,在注释处保留空行。
- 将其通过管道传输
column
并用于-e
保留空行,保存到临时文件 1。 - 提取注释,保存到临时文件2。
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 窗口不够大,无法容纳该行中的整个文本。