J'ai une chaîne que je voudrais manipuler. La chaîne est de H08W2345678
savoir comment pourrais-je la manipuler pour que la sortie soit juste W2345678
?
De même, si je voulais supprimer les 4 derniers caractères H08W2345678
pour que je sache H08W234
comment faire?
bash
shell
text-processing
sed
3kstc
la source
la source
sed
?H08W2345678
et doit le manipuler.W2345678
Cette valeur avec d'autres données sera mise dans un email envoyé. L'e-mailing sera effectué avec cron.awk
ing. Je crée un tableau et modifie ensuite chacun des éléments du tableau (tous différemment - c'est-à-dire changer le timestaimp Epoch en secondes en une date, etc.)printf %s\\n "XX,H08W2345678,YY" | awk -F, '{print substr($2, 4); print substr($2, 1, length($2)-4)}'
Réponses:
Utiliser simplement bash (ou d'
ksh93
où vient cette syntaxe ouzsh
):Consultez le wiki Wooledge pour en savoir plus sur la manipulation des chaînes .
la source
"${string:0:${#string}-4}"
Fonctionne dans la version bash 4.1 tant que la longueur$string
est d'au moins 4.abc-e
, où, lorsque vous déposez les trois premiers caractères, vous vous retrouvez-e
(carecho -e
ne fait pas ce que vous voulez).sed 's/^.\{3\}//'
trouvera les trois premiers caractères par^.\{3\}
et remplacera par vide. Ici^.
, correspondra à n'importe quel caractère au début de la chaîne (^
indique le début de la chaîne) et\{3\}
correspondra exactement au motif précédent 3 fois. Donc,^.\{3\}
correspondra aux trois premiers caractères.De même,
sed 's/.\{4\}$//'
remplacera les quatre derniers caractères par des blancs ($
indique la fin de la chaîne).la source
's/^.\{3\}//'
et's/.\{4\}$//'
comme j'apprends encore sed, merci beaucoup...
lieu de.\{3\}
car (pour moi) , il est plus facile à lire:sed -e 's/^...//' -e 's/....$//'
ou en une seule expression avec alternance:sed -r 's/^...|....$//g'
. S'il y avait plus de quelques caractères à supprimer, j'utiliserais l'/.\{17}\/
expression à la place de/.............../
.-e
ou-n
. Bien sûr, le sens de « laisser tomber les 4 derniers caractères » est pas défini pour une chaîne plus courte de 4 caractères, mais, si quelqu'un voulait adapter ce laisser tomber le premier ou le dernier un caractère, il pourrait exploser.Si vous avez un fichier dans lequel chaque ligne est une chaîne de onze caractères (ou autre) que vous souhaitez découper,
sed
c'est l'outil à utiliser. C'est bien pour manipuler une seule chaîne, mais c'est exagéré. Pour une seule chaîne, la réponse de Jason est probablement la meilleure, si vous avez accès à la version 4.2 ou supérieure de bash. Cependant, les syntaxes et semblent être uniques à bash (enfin, bash, ksh93, mksh et zsh) - je ne les vois pas dans The Open Group Base Specifications for Shell Command Language . Si vous êtes bloqué avec un shell compatible POSIX qui ne prend pas en charge l'expansion (extraction) de sous-chaîne, vous pouvez utiliser${parameter:offset}
${parameter:offset:length}
utiliser
printf
au lieu deecho
pour se prémunir contre les chaînes commeabc-e
, où, lorsque vous déposez les trois premiers caractères, vous vous retrouvez-e
(etecho -e
ne faites pas ce que vous voulez).Et, si vous n'utilisez pas du tout un shell de la famille Bourne (ou si vous utilisez un ancien système pré-POSIX), ceux-ci devraient toujours fonctionner:
Le premier espace est d'éviter les problèmes avec les valeurs de supplémentaires
$string
qui sont réelsexpr
opérateurs (par exemple+
,/
,index
oumatch
) ou d' options (par exemple--
,--help
ou--version
).la source
X
; par exempleexpr "X$string" : 'X...\(.*\)'
. OMI, c'est plus facile à lire et à comprendre. Y a-t-il un problème avec cela, ou une raison de préférer un espace? (3) Aujourd'hui, j'ai appris que celaexpr + "$string" : '...\(.*\)'
fonctionne maintenant. Je ne me souviens pas de cela il y a 40 ans; est-il suffisamment utilisé pour être recommandé en toute sécurité? (4) Vous avez manqué une note sur la réponse de jasonwryan et une pioche sur la réponse de heemayl.expr +
est uniquement GNU (ne fonctionnera pas sur Solaris ni FreeBSD AFAICS). J'utilise l'espace au lieu de x car il est moins probable que certainesexpr
implémentations aient des opérateurs qui commencent par l'espace qu'avecx
et aussi parce qu'il est moins probable qu'il y ait des éléments d'assemblage qui commencent par l'espace qu'avecx
. Mais je me rends compte que ce n'est probablement pas un bon choix pourexpr " $a" "<" " $b"
la comparaison de chaînes car certaines implémentations finissent par faire une comparaison numérique quand$a
/$b
ressemblent à des nombres. Peutexpr "@@$a"...
- être ouexpr "x $a"
pourrait être plus sûr.Avec:
Faire correspondre 3 ou 4 caractères semble simple (pour la plupart des shells):
Pour les plus anciens shells (comme le shell Bourne), utilisez:
Si un nombre de caractères est nécessaire, utilisez:
Bien sûr, ces expressions régulières fonctionnent également avec sed, awk et bash 3.0+:
la source
la source
cut
est beaucoup plus élégant que tout ce qui est sur cette page.