Comment puis-je supprimer les X premiers caractères de la chaîne en utilisant sed?

126

J'écris un script shell pour Linux embarqué dans une petite boîte industrielle. J'ai une variable contenant le texte pid: 1234et je veux supprimer les X premiers caractères de la ligne, donc seulement 1234 restent. J'ai plus de variables que je dois "nettoyer", donc je dois couper X premiers caractères et ${string:5}ne fonctionne pas pour une raison quelconque dans mon système.

La seule chose que la boîte semble avoir est sed.

J'essaie de faire fonctionner les éléments suivants:

result=$(echo "$pid" | sed 's/^.\{4\}//g')

Des idées?

Kokesh
la source
10
Si ${string:5}cela ne fonctionne pas, vous n'utilisez pas Bash ou un autre shell prenant en charge cette syntaxe. Quelle coque et quelle version utilisez-vous? À quoi ressemble ton shebang? Je suppose que vous utilisez sh(comme dash) ou peut-être zsh.
Suspendu jusqu'à nouvel ordre.

Réponses:

0

Cela fera aussi le travail:

echo "$pid"|awk '{print $2}'
Arnaud F.
la source
27
Cette question est la première réponse pour "sauter les N premiers caractères de la chaîne". Vous n'avez pas répondu à la question.
jww
Cela ne semble pas fonctionner, et si c'est le cas, pouvez-vous expliquer comment
Alexander Mills
Cela fonctionne sur mon système. Il peut y avoir un problème avec votre séparateur de champ, essayez awk -F": " '{print $2}'. Pourtant, pas ma solution préférée.
mzuther
197

Les éléments suivants devraient fonctionner:

var="pid: 1234"
var=${var:5}

Etes-vous sûr que bashle shell exécute votre script?

Même les compatibles POSIX

var=${var#?????}

serait préférable à l'utilisation d'un processus externe, bien que cela vous oblige à coder en dur les 5 sous la forme d'un modèle de longueur fixe.

chepner
la source
1
Vous pouvez également spécifier la longueur avec un deuxième paramètre: ${var:5:2}commencera à 1et retournera 12.
Max Candocia
108

Voici une méthode concise pour couper les premiers caractères X à l'aide de cut(1). Cet exemple supprime les 4 premiers caractères en coupant une sous-chaîne commençant par le 5ème caractère.

echo "$pid" | cut -c 5-
Randy le dev
la source
2
C'est la solution la plus simple!
Brandon
2
Techniquement, l'OP a demandé sed, mais je pense que c'est la meilleure solution pour "Comment puis-je supprimer les X premiers caractères de la chaîne [dans un terminal / bash]" Lorsqu'il est utilisé en combinaison avec git, c'est bien:git log --pretty=oneline | cut -c 42- | head
marksiemers
1
+1 Solution simple et utile. Quand j'ai eu l'URL comme http: // <example.com> et pour couper le protocole 'http: //' je dois dire que 8 caractères au lieu de 7. Je ne sais pas , mais c'est comme ça que ça a fonctionné pour moi.
Santosh Kumar Arjunan
1
Santosh Kumar Arjunan: c'est parce que l'exemple "echo" $ pid "| cut -c 4-" ne coupe pas les 4 premiers caractères mais extrait la sous-chaîne à partir du 4ème caractère. Par conséquent, il coupe les 3 premiers caractères. Ainsi, si vous voulez couper 7 premiers caractères, vous voulez tout extraire du 8ème caractère et donc effectivement faire "cut -c 8-"
al-ash
1
@DeanHiller cut -c ${LEN}-. Les accolades sont utilisées pour concaténer la chaîne avec des caractères de variable valides, afin de distinguer ce qui est la variable et ce qui ne l'est pas. Si vous voulez plus d'informations à ce sujet, recherchez "concaténation de chaînes de variables bash" pour plus de ressources sur pourquoi / comment cela fonctionne.
JustCarty le
46

Utilisez l' -roption ("utiliser des expressions régulières étendues dans le script") pour sedpour utiliser la {n}syntaxe:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234
Mark Longair
la source
1
comment serait-il pour le cas, si je voudrais supprimer les X derniers caractères d'une chaîne?
Kokesh
5
@Kokesh: vous pouvez faire sed -r 's/.{5}$//'pour enlever les 5 derniers caractères à la place
Mark Longair
7
Vous pouvez le faire sans -r( -Esous OS X, IIRC) si vous échappez aux accolades (je ne sais pas si cela fonctionne sous OS X, cependant).
Suspendu jusqu'à nouvel ordre.
2
@Dennis: Je viens de vérifier - échapper aux accolades (et laisser off -r/ -E) fonctionne sous OS X.
Gordon Davisson
15

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

$ string="1234567890"; echo "${string:2}"
34567890
dtp70
la source
@ dtp70 Merci beaucoup une réponse générique, cela a très bien fonctionné!
wolfram77
10

faites-le passer par 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
$
Ben
la source
8

Il y a de fortes chances que vous l'ayez cutaussi. Si c'est le cas:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234
Shawn Chin
la source
1
Le problème cutest qu'il ne gère pas les séquences d'espaces de manière raisonnable, l'utilisation tr -s ' 'de "presser" les espaces le rend meilleur.
Thor
1
Ce n'est pas censé être un outil de danse tout en chantant; il est simple et fait ce qu'il dit sur la boîte et est largement disponible. Cela devrait fonctionner parfaitement pour ces exigences, et est certainement plus robuste que de découper des caractères fixes à partir de positions spécifiques.
Shawn Chin
5

Eh bien, il y a eu des solutions ici sed, awk, cutet en utilisant la bashsyntaxe. Je veux juste ajouter une autre variante conforme à POSIX:

$ echo "pid: 1234" | tail -c +6
1234

-cindique à la queue à quel décalage d'octet commencer, en comptant à partir de la fin des données d'entrée, mais si le nombre commence par un +signe, c'est du début des données d'entrée à la fin.

Mecki
la source
4

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

result=`echo $pid | cut -c 5-`
Evgeny
la source
Il souhaite supprimer les 4 premiers caractères. Cela obtient les 4 premiers caractères.
MM.
2

J'ai trouvé la réponse en pure sed fournie par cette question (certes, postée après la publication de cette question). Cela fait exactement ce que vous avez demandé, uniquement dans sed:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

Le point dans sed '/./) correspond à ce que vous voulez faire correspondre. Votre question est exactement ce que j'essayais de faire, sauf dans mon cas, je voulais faire correspondre une ligne spécifique dans un fichier, puis décommenter. Dans mon cas, c'était:

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

L' -iaprès sedconsiste à modifier le fichier sur place (supprimez ce commutateur si vous souhaitez tester votre expression correspondante avant de modifier le fichier).

(J'ai posté ceci 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.)

tête d'arbre
la source
1

Plutôt que de supprimer n caractères du début, peut-être pourriez-vous simplement extraire les chiffres directement. Ainsi...

$ echo "pid: 1234" | grep -Po "\d+"

Cela peut être une solution plus robuste et semble plus intuitive.

user1751825
la source