Sed uniquement imprimer l'expression correspondante

4

Comment faire en sorte que sed n'imprime que l'expression correspondante?

Je souhaite réécrire des chaînes telles que "Batterie 0: charge, 44%, charge" dans "Batterie: 44%". J'ai essayé ce qui suit:

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

Ça ne marche pas.

La "solution" courante consiste à utiliser les fonctions de recherche, de remplacement et de correspondance de la ligne entière: sed -n 's/.*\([0-9]*%\).*/Battery: \1/p' Maintenant, les. * Sont trop gourmands et le \ 1 n'est que le%.

De plus, je ne veux pas faire correspondre plus que nécessaire.

user75250
la source

Réponses:

8
  • Rendre l’expression rationnelle un peu plus précise.

    sed -n 's/.* \([0-9]*%\),.*/Battery: \1/p'
    
  • Choisissez un outil différent.

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

    (Juste pour info, foo && bar est un raccourci pour if (foo) { bar }.)

grawity
la source
Ah L'espace dans la première expression rationnelle le fait fonctionner comme un charme. Malheureusement, vous devez toujours faire correspondre la chaîne entière. Je vais probablement essayer awk.
user75250
Il me semble que même awk n'est pas capable de le faire. Je dois donc utiliser du Perl complet pour faire correspondre une chaîne et la reformater?
user75250
@user: Pensez-vous qu'il y a quelque chose qui ne va pas avec Perl? :)
grawity
Ce script est utilisé pour mettre à jour la barre d'état dans wmii, donc à peu près toutes les secondes, je suppose. Je ne sais pas si perl consomme trop de ressources s'il est utilisé uniquement dans le but de réécrire une chaîne. Je suppose que je dois écrire mon propre outil.
user75250
@user: Dans ce cas, essayez bash [[ $val =~ regex ]], de même que $BASH_REMATCH. En outre, étant donné l'état de la batterie, envisagez d'augmenter l'intervalle à 5 ou 7 secondes. (Au fait, Linux peut-il mettre en cache le binaire Perl en mémoire après le premier exec?)
grawity
2

Peut-être que vous pourriez grep -o (le -o est important) pour les valeurs requises à la place et utilisez celles de votre script (?). Ainsi, vous pouvez utiliser la valeur de manière plus créative ou peut-être simplement encapsulée echo etc.

PriceChild
la source
Je préférerais le faire avec sed (ou se faire dire que ce n'est pas possible et utiliser awk) au cas où je voudrais l'étendre pour faire des choses plus compliquées avec la chaîne.
user75250