J'écris un script Shell pour Linux intégré dans un petit boîtier industriel. J'ai une variable contenant le texte pid: 1234
et je veux effacer les X premiers caractères de la ligne. Il ne reste donc que 1234 entrées. J'ai plus de variables à "nettoyer", je dois donc supprimer X premiers caractères et ${string:5}
ne fonctionne pas pour une raison quelconque dans mon système.
La seule chose que semble avoir la boîte est sed
.
J'essaie de faire fonctionner ce qui suit:
result=`echo "$pid" | sed 's/^.\{4\}//g'`
Des idées?
Cela fera aussi le travail:
echo "$pid"|awk '{print $2}'
Ce qui suit devrait fonctionner:
var="pid: 1234"
var=${var:5}
Êtes-vous sûr que bash
est-ce que le shell exécute votre script?
Même le compatible POSIX
var=${var#?????}
serait préférable à l'utilisation d'un processus externe, bien que cela nécessite de coder en dur le 5 sous la forme d'un motif de longueur fixe.
Voici une méthode concise pour couper les premiers caractères X en utilisant cut(1)
. Cet exemple supprime les 4 premiers caractères.
echo "$pid" | cut -c 4-
Utilisez l'option -r
("utiliser des expressions régulières étendues dans le script") sur sed
pour utiliser la syntaxe {n}
:
$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
Couper les deux premiers caractères de la chaîne:
string="1234567890"; echo "${string:2}"
Les chances sont, vous aurez cut
ainsi. Si c'est le cas:
[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
transmettez-le à travers awk '{print substr($0,42)}'
où 42 est un de plus que le nombre de caractères à supprimer. Par exemple:
$ echo abcde| awk '{print substr($0,2)}'
bcde
$
Une autre façon, en utilisant cut
au lieu de sed
.
result=`echo $pid | cut -c 5-`
Plutôt que de supprimer n caractères au début, vous pourriez peut-être extraire directement les chiffres. Ainsi...
$ echo "pid: 1234" | grep -Po "\d+"
Cela peut être une solution plus robuste et semble plus intuitive.
Eh bien, il y a eu des solutions ici avec sed
, awk
, cut
et en utilisant la syntaxe bash
. Je veux juste ajouter une autre variante conforme à POSIX:
$ echo "pid: 1234" | tail -c +6
1234
-c
indique à quelle queue l'octet doit commencer, en comptant à partir de la fin des données d'entrée. Cependant, si le nombre commence par un signe +
, il se situe du début à la fin des données.
J'ai trouvé la réponse en pure sed fournie par cette question (certes, postée après que cette question ait été postée). Cela fait exactement ce que vous avez demandé, uniquement dans sed:
result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``
Le point dans sed '/./
) correspond à tout ce que vous voulez faire correspondre. Votre question porte exactement sur ce que j’essayais de faire, sauf que dans mon cas, je voulais faire correspondre une ligne spécifique dans un fichier, puis la décommenter. Dans mon cas c'était:
# Uncomment a line:
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file
Le -i
après sed
permet de modifier le fichier à la place (supprimez ce commutateur si vous souhaitez tester l'expression correspondante avant de modifier le fichier).
(FTR, je n'ai pas posté cette réponse pour le crédit, mais simplement parce que je voulais le faire entièrement avec sed car cette question était posée et aucune des réponses précédentes n'a résolu ce problème.)