Sed apenas imprime expressão combinada

4

Como fazer sed apenas imprimir a expressão correspondente?

Eu quero reescrever strings como "Bateria 0: Carregando, 44%, carregando" para "Bateria: 44%". Eu tentei o seguinte:

sed -n '/\([0-9]*%\)/c Battery: \1'

Isso não funciona.

A "solução" comum é usar a pesquisa e substituir e combinar a linha inteira: sed -n 's/.*\([0-9]*%\).*/Battery: \1/p' Agora, os * são muito gananciosos e o \ 1 é apenas o%.

Além disso, não quero corresponder mais do que preciso.

user75250
fonte

Respostas:

8
  • Faça o regexp um pouco mais específico.

    sed -n 's/.* \([0-9]*%\),.*/Battery: \1/p'
    
  • Escolha uma ferramenta diferente.

    perl -ne '/(\d+%)/ && print "Battery: $1\n";'
    

    (apenas para o registro, foo && bar é uma abreviação para if (foo) { bar }.)

grawity
fonte
Ah O espaço no primeiro regexp faz com que funcione como charme. Infelizmente você ainda tem que combinar toda a string. Eu provavelmente vou tentar o awk.
user75250
Parece-me que até o awk não é capaz de fazer isso. Então eu tenho que usar full perl soprado para combinar com uma string e reformatá-lo?
user75250
@user: Você está sugerindo que há algo errado com o Perl? :)
grawity
Este script é usado para atualizar a barra de status no wmii, então em torno de cada segundo eu acho. Eu não sei se o perl consome muitos recursos se usado apenas para esse propósito de reescrever uma string. Acho que tenho que escrever minha própria ferramenta.
user75250
@user: Nesse caso, tente o bash [[ $val =~ regex ]], junto com $BASH_REMATCH. Além disso, como é o status da bateria, considere aumentar o intervalo para 5 ou 7 segundos. (A propósito, o Linux pode armazenar em cache o binário Perl na memória após o primeiro exec?)
grawity
2

Talvez você pudesse grep -o (o -o é importante) para os valores requeridos e usá-los em seu script (?) Dessa forma, você poderia usar o valor de maneiras mais criativas ou talvez apenas envolto em echo etc

PriceChild
fonte
Eu preferiria fazê-lo com sed (ou ser dito que não é possível e usar o awk) caso eu queira estendê-lo para fazer coisas mais complicadas com a string.
user75250