152 votes

Comment enlever les X premiers caractères d'une chaîne de caractères avec sed ?

J'écris un shell script pour Linux embarqué dans une petite boîte industrielle. J'ai une variable contenant le texte pid: 1234 et je veux enlever les X premiers caractères de la ligne, pour ne garder que 1234. J'ai plus de variables que je dois "nettoyer", donc je dois couper les 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 ce qui suit :

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

Des idées ?

8voto

Shawn Chin Points 29756

Il y a des chances que vous ayez cut également. Si c'est le cas :

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

6voto

Mecki Points 35351

Eh bien, il y a eu des solutions ici avec sed , awk , cut et en utilisant bash la syntaxe. Je veux juste ajouter une autre variante conforme à POSIX :

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

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

4voto

Evgeny Points 1387

D'une autre manière, en utilisant cut au lieu de sed .

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

2voto

treehead Points 66

J'ai trouvé la réponse dans le sed pur fourni par cette question (il est vrai qu'il a été posté 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 '/./ ) est ce que vous voulez faire correspondre. Votre question est exactement ce que j'essayais de faire, sauf que dans mon cas, je voulais faire correspondre une ligne spécifique dans un fichier et ensuite la 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

Le site -i après sed est de modifier le fichier sur place (supprimez cette option si vous souhaitez tester votre expression de correspondance avant de modifier le fichier).

(J'ai posté ceci parce que je voulais le faire entièrement avec sed comme cette question le demandait et aucune des réponses précédentes n'a résolu ce problème).

0voto

user1751825 Points 1464

Plutôt que de retirer n caractères du début, vous pourriez peut-être extraire directement les chiffres. Comme ça...

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

Cette solution est peut-être plus robuste et semble plus intuitive.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X