私の設定ファイルには次の行があります。
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
awk
2番目の列もリスト#
したいですawk
。
awk '/bindsym/{print $2}' filename
それを取得する方法がわからない#
。
好ましい出力は、キーの後にコメントテキストが続くことです。
$mod+F2 Open terminal
答え1
$ 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文字を割り当て、それらの間にタブ文字を配置します(良い測定のため)。
答え2
GNU機能を活用して行から行末までmatch()
一致させます。awk
#
awk '/bindsym/ && match($0,/#(.+)$/,arr){print $2, arr[1]}' filep
このmatch()
関数は、2番目のパラメータの正規表現と一致するパターンで3番目のパラメータに指定された配列を埋めます。
すべてのPOSIXでawk
の3番目のパラメータはmatch()
次のとおりです。いいえサポートされていますが、表示するRSTART
いくつかの特殊変数がありますRLENGTH
スタートそして長さ一致するグループ。substr()
一致する文字列を取得するには、現在の行でこの関数を使用します。
awk '/bindsym/ && match($0,/#(.+)$/){print $2, substr($0,RSTART+1,RLENGTH)}' file
printf()
出力をきれいに印刷するには、他の回答の機能を使用できます。
答え3
これは簡単ですsed
。データは実際にはフィールド指向ではないので、awkはここで大きな利点を提供しません。
sed 's/^[^ ]* //;s/ .*#//' inputfile
翻訳する:
s/^[^ ]* //
最初の空白文字の前のすべての項目を削除します。
s/ .*#//
行の最初の(残りの)空白文字から最後の文字まで#
すべての項目を削除します。
答え4
Step1: count=`awk '{print NR}'|sed -n '$p' filename`
Step2:for ((i=1;i<=$count;i++)); do awk -v i="$i" 'NR==i && $0 ~ /^bindsym/{print $2}' filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g"
output
for ((i=1;i<=$count;i++)); do awk -v i="$i" 'NR==i && $0 ~ /^bindsym/{print $2}' filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g"
$mod+F2 Open terminal
$mod+p Popup Dictionary
$mod+Mod1+l Dmenu for my books collection
Mod1+Control+b nnn file browser