コードを列にフォーマットするスクリプト

コードを列にフォーマットするスクリプト

多くの場合、左の自動インデントではなく、同様の行構造に基づいてコードをソートしたいと思います。このようなことができるスクリプトはありますか?以下は私がやりたいことの例です。一方:

            self.colorOfBackground =? colorOfBackground
            self.colorOfLineForTime =? colorOfLineForTime
            self.marginOnBottom =? marginOnBottom
            self.marginOnTop =? marginOnTop
            ...

スクリプトを実行し、タブの各「列」をソートしてソートし、視覚的に簡単に解析したいと思います。

            self.colorOfBackground     =?    colorOfBackground
            self.colorOfLineForTime    =?    colorOfLineForTime
            self.marginOnBottom        =?    marginOnBottom
            self.marginOnTop           =?    marginOnTop
            ...

私はPerlやPython、AWK、または他のスクリプト言語がこれを行うことができると思いましたが、残念ながら、私はこれらについてあまり知りません。これまで、私はVimとVimの正規表現ベースの代替機能を使用してきましたが、まだほとんどの時間を手動で列間隔を指定するのに費やしています。

答え1

これにより、期待される結果が得られます。

ファイル.txt:

self.colorOfBackground =? colorOfBackground
self.colorOfLineForTime =? colorOfLineForTime
self.marginOnBottom =? marginOnBottom
self.marginOnTop =? marginOnTop

次のコマンドを使用する場合:

sed 's/^[[:blank:]]*//' File.txt | column -t -s "  "

このコマンドは先行スペースを削除します。sed 's/^[[:blank:]]*//'このスタックオーバーフローの質問を参照して、このコマンドが実際にスタックオーバーフローで実行する操作を例とともに詳細に説明します。ここをクリック

通事論: column -t [-s separator] [filename] -> column -t -s " "

-t:内容をテーブル形式で表示するためのパラメータ

-s: 特定の区切り文字に基づいてコンテンツを区切ります。

コマンド出力:

self.colorOfBackground   =?  colorOfBackground
self.colorOfLineForTime  =?  colorOfLineForTime
self.marginOnBottom      =?  marginOnBottom
self.marginOnTop         =?  marginOnTop

上記のコマンドを使用して使用したデータを並べ替える前に、ファイルのデータ全体を左揃えにする必要があります。sed 's/^[[:blank:]]*//'

答え2

答えを受け入れても、コマンドに接続せずに、またはawkコマンドsedを使用して目的の結果を得ることができます。column

awk '{print $1"\t\t"$2"\t\t"$3}' column.txt

sed -e 's/^[[:blank:]]*//' -e 's|\s|\t\t|g' column.txt

このsedコマンドは、最初に各行の先頭からすべてのスペースを削除し、残りのスペースを2つのタブに変換します。次の出力が提供されます。

self.colorOfBackground          =?              colorOfBackground
self.colorOfLineForTime         =?              colorOfLineForTime
self.marginOnBottom             =?              marginOnBottom
self.marginOnTop                =?              marginOnTop

このawkコマンドは、最初の列、つまりで始まる文字列、self2つのタブ、2番目の列、つまり=?他の2つのタブ、最後に3番目の列の文字列のみを印刷します。

self.colorOfBackground          =?      colorOfBackground
self.colorOfLineForTime         =?      colorOfLineForTime
self.marginOnBottom             =?      marginOnBottom
self.marginOnTop                =?      marginOnTop

ファイルを標準出力に送信するのではなく、ファイル自体を編集するには、次のいずれかのコマンドを使用します。

sed -i -e 's/^[[:blank:]]*//' -e 's|\s|\t\t|g' column.txt 

awk -i inplace '{print $1"\t\t"$2"\t\t"$3}' column.txt

このコマンドを実行するには、スイッチをawk使用するにはバージョン4.2以降が必要です。-i inplace

答え3

必要なものは次のとおりです。

$ column -t file
self.colorOfBackground   =?  colorOfBackground
self.colorOfLineForTime  =?  colorOfLineForTime
self.marginOnBottom      =?  marginOnBottom
self.marginOnTop         =?  marginOnTop

または必要に応じて:

$ column -t -o'    ' file
self.colorOfBackground     =?    colorOfBackground
self.colorOfLineForTime    =?    colorOfLineForTime
self.marginOnBottom        =?    marginOnBottom
self.marginOnTop           =?    marginOnTop

$ column -t -o$'\t' file
self.colorOfBackground  =?      colorOfBackground
self.colorOfLineForTime =?      colorOfLineForTime
self.marginOnBottom     =?      marginOnBottom
self.marginOnTop        =?      marginOnTop

$ column -t -o$'\t\t' file
self.colorOfBackground          =?              colorOfBackground
self.colorOfLineForTime         =?              colorOfLineForTime
self.marginOnBottom             =?              marginOnBottom
self.marginOnTop                =?              marginOnTop

column引数を適切に調整してください。

関連情報