我的配置文件里有这样的行,
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
出第二列和#
后面的内容。我使用awk
作为
awk '/bindsym/{print $2}' filename
不过,我不知道如何在#
之后获得文本。首选输出是键,然后是注释文本,如
$mod+F2 Open terminal
发布于 2019-05-02 08:18:25
$ 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
首先提取每行上的第二个字段,从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
逻辑是相同的,但是输出为两个字段(左对齐)中的每个字段分配20个字符,并在它们之间放置一个制表符(以获得良好的度量)。
发布于 2019-05-02 08:23:14
使用GNU awk
的match()
函数来匹配从#
到行尾的部分
awk '/bindsym/ && match($0,/#(.+)$/,arr){print $2, arr[1]}' filep
match()
函数使用第二个参数中正则表达式中匹配的模式填充第三个参数中提供的数组。
在任何POSIX awk
上,都不支持match()
的第三个参数,而是一对特殊变量RSTART
和RLENGTH
,它们标志着匹配组的开始和长度。我们使用当前行上的substr()
函数来获得匹配的字符串
awk '/bindsym/ && match($0,/#(.+)$/){print $2, substr($0,RSTART+1,RLENGTH)}' file
要漂亮地打印输出,可以像在另一个答案中一样使用printf()
函数。
发布于 2019-06-11 12:24:40
在sed
中这样做非常简单;因为您的数据并不是真正面向字段的Awk,所以这里没有提供很大的好处:
sed 's/^[^ ]* //;s/ .*#//' inputfile
翻译:
s/^[^ ]* //
删除到并包括第一个空格字符的所有内容。
s/ .*#//
删除第一个(剩余)空格字符中的所有内容,直到行上的最后一个#
字符。
https://unix.stackexchange.com/questions/516796
复制