web-dev-qa-db-fra.com

Comment puis-je supprimer les X premiers caractères d'une chaîne en utilisant sed?

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?

90
Kokesh

Cela fera aussi le travail:

echo "$pid"|awk '{print $2}'
18
Arnaud F.

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.

158
chepner

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-
67
Randy the Dev

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
43
Mark Longair

Couper les deux premiers caractères de la chaîne:

string="1234567890"; echo "${string:2}"
8
dtp70

Les chances sont, vous aurez cut ainsi. Si c'est le cas:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
6
Shawn Chin

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
$
4
Ben

Une autre façon, en utilisant cut au lieu de sed.

result=`echo $pid | cut -c 5-`
3
Evgeny

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.

0
user1751825

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.

0
Mecki

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.)

0
treehead