J'écris un script shell pour Linux embarqué dans une petite boîte industrielle. J'ai une variable contenant le texte pid: 1234
et 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?
${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 utilisezsh
(commedash
) ou peut-êtrezsh
.Réponses:
Cela fera aussi le travail:
la source
awk -F": " '{print $2}'
. Pourtant, pas ma solution préférée.Les éléments suivants devraient fonctionner:
Etes-vous sûr que
bash
le shell exécute votre script?Même les compatibles POSIX
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.
la source
${var:5:2}
commencera à1
et retournera12
.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.la source
git log --pretty=oneline | cut -c 42- | head
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.Utilisez l'
-r
option ("utiliser des expressions régulières étendues dans le script") poursed
pour utiliser la{n}
syntaxe:la source
sed -r 's/.{5}$//'
pour enlever les 5 derniers caractères à la place-r
(-E
sous OS X, IIRC) si vous échappez aux accolades (je ne sais pas si cela fonctionne sous OS X, cependant).-r
/-E
) fonctionne sous OS X.Coupez les deux premiers caractères de la chaîne:
la source
faites-le passer par
awk '{print substr($0,42)}'
où 42 est un de plus que le nombre de caractères à supprimer. Par exemple:la source
Il y a de fortes chances que vous l'ayez
cut
aussi. Si c'est le cas:la source
cut
est qu'il ne gère pas les séquences d'espaces de manière raisonnable, l'utilisationtr -s ' '
de "presser" les espaces le rend meilleur.Eh bien, il y a eu des solutions ici
sed
,awk
,cut
et en utilisant labash
syntaxe. Je veux juste ajouter une autre variante conforme à POSIX:-c
indique à 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.la source
Une autre façon, en utilisant
cut
au lieu desed
.la source
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:
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:L'
-i
aprèssed
consiste à 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.)
la source
Plutôt que de supprimer n caractères du début, peut-être pourriez-vous simplement extraire les chiffres directement. Ainsi...
Cela peut être une solution plus robuste et semble plus intuitive.
la source