Eu tenho esse tipo de linha em meus arquivos de configuração,
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
Eu quero awk
sair a segunda coluna e as coisas que estão depois do #
. estou usando awk
como
awk '/bindsym/{print $2}' filename
Não tenho certeza de como obter o texto após o #
.
A saída preferida é, as chaves e, em seguida, o texto do comentário como
$mod+F2 Open terminal
Isso é usado
awk
para primeiro extrair o segundo campo em cada linha começando combindsym
a variávelkey
. Em seguida, ele exclui tudo, inclusive o que está#
na linha e imprimekey
e o que resta da linha com uma tabulação como delimitador.Formatação de saída alternativa:
A lógica é a mesma, mas a saída aloca 20 caracteres para cada um dos dois campos (justificados à esquerda) e coloca uma tabulação entre eles (para uma boa medida).
Usando a
match()
função do GNUawk
para combinar a parte#
até o final da linhaA
match()
função preenche a matriz fornecida no terceiro argumento com o padrão correspondente da regex no segundo argumento.em qualquer POSIX
awk
, o terceiro argumento nãomatch()
é suportado, mas algumas variáveis especiais e que marcam o início e o comprimento do grupo correspondente. Usamos a função na linha atual para obter a string correspondenteRSTART
RLENGTH
substr()
Para imprimir a saída, você pode usar a
printf()
função como na outra resposta.Isso é muito simples de fazer em
sed
; como seus dados não são realmente orientados a campo, o Awk não oferece um grande benefício aqui:Tradução:
Exclua tudo até e incluindo o primeiro caractere de espaço.
Exclua tudo, desde o primeiro caractere de espaço (restante) até o último
#
caractere da linha.