
テキストエディタで /etc/fstab を編集すると、すべてのスペースが誤ってソートされます。ファイルを見て、スペースを挿入/削除してすべての項目を並べ替えることができますが、より自動化されたソリューションを探しています。理想的には、fstabを入れてすべてを「きれいに」ソートできるオンラインJavaScriptページが必要です。その後、最終結果をファイルにコピーして貼り付けることができます。
類似またはより良い解決策はありますか?
編集:
私はデスクトップ上で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 ドキュメントを使用して再度コピーして貼り付けることができます。
単一のスペースではなくタブを使用してfstabを区切る必要があります。特に、両方を同時に使用する場合、これは不一致を引き起こす可能性があります。
シェルウィンドウが1行のテキスト全体を収めるのに十分な大きさではないため、奇妙に見えます。