ファイルの行を選択的に変更する方法(修正は行を個別に分析するのではなく全体を選択する方法)

ファイルの行を選択的に変更する方法(修正は行を個別に分析するのではなく全体を選択する方法)

長い話を短くコメントを無視しながら、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

おすすめ記事