3 votes

Comment obtenir le mode modem en utilisant sed ou awk à partir d'une sortie modem ?

Je ne suis pas un expert en bash et j'ai des difficultés à filtrer la sous-chaîne correcte.

J'ai

echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"

qui se traduit par

AT^SYSCFGEX=\"0201\",3fffffff,2,4,7fffffffffffffff,,

Comment puis-je obtenir 0201 comme résultat ? J'ai du mal avec cela.

4voto

dessert Points 36815

Con sed

sed -r 's/[^0-9]*([0-9]+).*/\1/'

extrait le premier chiffre de la chaîne.

Exemple d'exécution

$ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | sed -r 's/[^0-9]*([0-9]+).*/\1/'
0201

Explications

  • -r - utiliser des expressions régulières étendues
  • s/a/b/ - substitut a por b
  • [^0-9]* - saisir tout sauf un chiffre, ici ça correspond AT^SYSCFGEX=\"
  • ([0-9]+) - saisir au moins un chiffre et le sauvegarder dans un groupe, ici cela correspond 0201
  • .* - saisir tout le reste de la ligne, ici elle correspond \",3fffffff,2,4,7fffffffffffffff,,
  • \1 - récupérer le contenu du premier groupe sauvegardé avant

3voto

Byte Commander Points 99026

Voici une alternative utilisant grep en mode PCRE ( -P ) avec des exceptions pour les expressions rationnelles, ne montrant que les parties correspondantes de chaque ligne ( -o ) :

grep -Po '(?<=\\")\d+(?=\\")'

Cela correspond à tous les nombres qui sont enfermés dans des guillemets doubles avec antislash, comme par exemple \"0201\" mais sans renvoyer les guillemets dans le résultat.

  • (?<=\\") est un lookbehind, qui correspond à une chaîne vide si elle est précédée par le motif interne ( \" ).
  • \d+ correspond à un ou plusieurs chiffres.
  • (?=\\") est un lookahead, qui correspond à une chaîne vide si elle est suivie par le motif interne ( \" ).

Exemple :

$ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | grep -Po '(?<=\\")\d+(?=\\")'
0201

2voto

dessert Points 36815

Con bash Expansion des paramètres de l'UE

Si vous voulez utiliser uniquement bash vous pouvez le faire comme ceci :

$ var="AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"
$ echo ${var#*\"}
0201\",3fffffff,2,4,7fffffffffffffff,,
$ var=${var#*\"}
$ echo ${var%%\\\"*}
0201

Explications

  • ${var#*\"} - s'étend au contenu de la variable var avec le modèle de correspondance *" (c'est-à-dire tout jusqu'à " ) dépouillé depuis le début
  • ${var%%\\\"*} - s'étend au contenu de la variable var avec le modèle de correspondance \"* (c'est-à-dire tout ce qui va de \" ) dépouillé de la fin.

Autres lectures

1voto

Sergiy Kolodyazhnyy Points 97292

Voici un awk approche. L'idée ici est que awk ( ou pour être précis, GNU awk ) peut utiliser plusieurs caractères comme séparateurs. Ainsi, on peut utiliser \ y " comme séparateurs, pour extraire la chaîne de caractères souhaitée avec :

awk -F '[\\\\"]' '{print $3}'

Notez les multiples \ , qui sont nécessaires pour échapper à la barre oblique inverse et éviter qu'elle soit interprétée par le Shell comme un échappement pour le caractère suivant.

Avec le echo dans la question,

$ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | awk -F '[\\\\"]' '{print $3}'
0201

Alternativement, nous pourrions simplement utiliser " comme séparateur et couper le dernier \ via substr() fonction :

$ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | awk -F '"' '{print substr($2,1,length($2)-1)}'
0201

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X