構成ファイルに出力します
bindsym $mod+F2 exec gnome-terminal #Open terminal bindsym $mod+p exec command /some/path" #Popup Dictionary bindsym $mod+Mod1+l exec --no-startup-id /some/path/command #Dmenu for my books collection bindsym Mod1+Control+b exec rxvt -e nnn #nnn file browser
2番目の列と#
の後にあるものをawk
削除したいと思います。 awk
を
awk "/bindsym/{print $2}" filename
として使用しています
。
推奨される出力は、キーとコメントテキストです。
$mod+F2 Open terminal
回答
$ awk -v OFS="\t" "/^bindsym/ { key = $2; sub(".*#", ""); print key, $0 }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser
これは、awk
を使用して、最初に各行の2番目のフィールドを抽出しますbindsym
で始まり変数key
に入ります。次に、行の#
までのすべてを削除し、key
と行の残りの部分を次のようにタブで出力します。区切り文字。
代替出力フォーマット:
$ awk "/^bindsym/ { key = $2; sub(".*#", ""); printf("%-20s\t%-20s\n", key, $0) }" file $mod+F2 Open terminal $mod+p Popup Dictionary $mod+Mod1+l Dmenu for my books collection Mod1+Control+b nnn file browser
ロジックは同じですが、出力は2つのそれぞれに20文字を割り当てます(左寄せ)フィールドとその間にタブを配置します(適切な測定のため)。
回答
ivの使用#
から行末までの部分に一致するGNU awk
のid = “b2b5f2c3bd”>
関数
awk "/bindsym/ && match($0,/#(.+)$/,arr){print $2, arr[1]}" filep
match()
関数は、3番目の引数で提供された配列に、2番目の引数の正規表現からの一致したパターンを入力します。
どのPOSIX awk
でも、match()
の3番目の引数はサポートされていません 、ただし、いくつかの特別な変数RSTART
とRLENGTH
は、一致したグループの開始と長さをマークします。現在の行でsubstr()
関数を使用して、一致する文字列を取得します
awk "/bindsym/ && match($0,/#(.+)$/){print $2, substr($0,RSTART+1,RLENGTH)}" file
出力をきれいに印刷するには、他の回答と同じようにprintf()
関数を使用できます。