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?


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}'

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.


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-

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

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

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

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.


4

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

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

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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.