Veuillez considérer cet extrait:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* //p')
Je veux mettre le dernier mot dans une variable si une condition de modèle correspond aux lignes d'un fichier texte arbitraire
Mon problème est que la variable X
a CR ou LF ou CRLF à la fin, selon le fichier source, dont je veux me débarrasser, car cela interfère avec une opération ultérieure que j'ai l'intention de faire.
J'ai même essayé quelque chose comme:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* \([A-Za-z]\+\)/\1/p')
s'attendant donc à ce que la sed
sortie soit limitée, [A-Za-z]+
mais il y a toujours ces octets gênants à l'intérieur de la variable X.
Comment puis - je me débarrasser, sans utiliser trop de code comme voir ce que les octets sont à la fin avec xxd
puis cut
et des complications similaires?
X
CR
, mais il y en aura unLF
. J'ai eu du mal à comprendre ce que vous voulez de la question, j'espère que mon montage fait ce que vous voulez.grep/sed
solution à la placeawk
(que je ne comprends pas), sinon je l'utilise. MerciLe
``
ou$()
supprimera la nouvelle ligne de la fin, mais pour le faire par programme, utiliseztr
.Cela supprimera le retour chariot et / ou la nouvelle ligne de la chaîne.
Quel pourrait être le problème est de savoir comment vous sortez ensuite le résultat. Par exemple, par défaut,
echo
ajoute une nouvelle ligne. Vous pouvez utiliserecho -n
ouprintf
.la source
-m1
veillerai à ce qu'il n'y a qu'une seule sortie ligne, qui , selon toute vraisemblance, aurait le retour chariot à la fin.tr
... intéressant, fonctionne à la fois sur les fichiers LF et CRLF. Je pense que\010\013
pour une raison quelconque, et\f\r
fonctionne également correctement. À propos du résultat: je ne mets pas réellement la sortie en variable mais en tant que variable enfermée$()
dans le modèle pourgrep
match -some pipe | grep -o " $(...) "
. Merci pour les commentairesJe préfère cette façon
la source
Cela fonctionne pour moi:
la source
Pourquoi ne pas simplement laisser
sed
faire le[\r\f]
nettoyage:Votre deuxième approche n'a pas de regex finale pour attraper le CR de fuite,
\r
.la source
La version normale de grep (y compris grep -P) sort toujours un saut de ligne avec sa correspondance, donc si vous n'avez qu'un seul résultat (ou si vous voulez seulement que le saut de ligne ajouté final soit supprimé), il suffit de supprimer simplement le caractère final de la sortie, ce que vous pouvez faire en le canalisant
head -c-1
.la source