Comment faire pour supprimer le dernier caractère d'un grep bash sortie
COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2`
sorties à quelque chose comme ceci
"Abc Inc";
Ce que je veux faire, je veux supprimer la fin ";" ainsi. Comment puis-je le faire? Je suis un débutant à bash. Des idées ou des suggestions serait utile.
- Même ici.
cat
/grep
=grep
. - Pour le problème à la main, il aurait été possible de résoudre avec juste grep: COMPANY_NAME=$(grep -Po '(?<=company_name=)"[^"]*"' file.txt)
Vous devez vous connecter pour publier un commentaire.
J'utiliserais
sed 's/;$//'
. par exemple:cat
s.grep
peut lire les fichiers, le saviez-vous? 😉cat
ici. Je l'ai laissé dans le chat afin d'éviter de changer la ligne de commande à partir de la question au-delà de ce qui était réellement nécessaire pour le faire fonctionner.Cela va supprimer le dernier caractère contenues dans votre COMPANY_NAME var, peu importe si elle est ou non un point-virgule:
for L in `ls *key` ; do echo ${L%.key} ; done
J'utiliserais
head --bytes -1
, ouhead -c-1
pour faire court.head
sorties seulement le début d'un ruisseau ou d'un fichier. Généralement, il compte le nombre de lignes, mais il peut être fait pour compter les caractères ou octets au lieu de cela.head --bytes 10
sera la sortie de la première dizaine de personnages, maishead --bytes -10
sera de sortie à tout sauf à la dernière de dix.NB: vous pouvez avoir des problèmes si le dernier caractère est multi-octets, mais un point-virgule n'est pas
Je recommande cette solution sur
sed
oucut
parce quehead
a été conçu pour faire, donc moins d'options de ligne de commande et facile à lire de commandebrew install coreutils
ensuite, vous pouvez utiliserghead -c-1
Je crois que la façon la plus propre à la bande un caractère unique à partir d'une chaîne avec bash est:
mais je n'ai pas été en mesure d'intégrer la commande grep pièce à l'intérieur des accolades, alors votre tâche devient un deux-doublure:
Cette bande de n'importe quel caractère, point-virgule ou pas, mais pouvez vous débarrasser de la point-virgule spécifiquement, trop.
Pour supprimer TOUS les points-virgules, où ils peuvent tomber:
Pour supprimer uniquement un point-virgule à la fin:
Ou, pour supprimer plusieurs points-virgules à partir de la fin:
Pour de grands détails, et en savoir plus sur cette approche, Le Projet de Documentation Linux, couvre beaucoup de terrain à http://tldp.org/LDP/abs/html/string-manipulation.html
À l'aide de
sed
, si vous ne savez pas ce que le dernier caractère est en fait:\{1\}
depuis.
signifie un caractère unique.Ne pas abuser de
cat
s. Saviez-vous quegrep
peut lire les fichiers, trop?L'approche canonique serait celui-ci:
l'approche plus intelligente serait d'utiliser un seul
perl
ouawk
instruction, qui peut ne filtre et les différentes transformations à la fois. Par exemple quelque chose comme ceci:n'avez pas à chaîne donc de nombreux outils. Juste une commande awk fait le travail
En Bash en utilisant seulement un utilitaire externe:
En supposant que les guillemets sont en fait une partie de la sortie, ne pourriez-vous utiliser l'option-o pour retourner tout ce qui est entre les guillemets?
Certains ajustements à la réponse ci-dessus. Pour supprimer plus d'un char vous ajoutez plusieurs points d'interrogation. Par exemple, pour supprimer les deux derniers caractères de la variable $SRC_IP_MSG, vous pouvez utiliser:
cat
chaque élément de la canalisation qui n'travail réel fonctionne sur son entrée standard et la sortie standard. l'avantage est que vous pouvez remplacer lecat
avec quelques autres pipeline qui produit une sortie semblable àfile.txt
et vous n'avez pas à changer, même un seul caractère dans la partie fonctionnelle de la canalisation. cela permet à la baisse-dans le pipeline de la réutilisabilité.cat
juste pour vous donner la possibilité de le remplacer par quelque chose d'autre plus tard. La seule chose que j'ai pu voir, elle vaut pour est la simplicité. Si un utilisateur tapegrep pattern file
, alors je suis sacrément sûr qu'il comprenne c'est que la première partie qui lit le fichier et l'endroit où il commence la tuyauterie d'elle.grep foo file | grep bar | wc
et il est raisonnable de direcat file | grep foo | grep bar | wc
. ce n'est pas raisonnable est de donner inutile chat prix pour le second. il y a plusieurs points spécifiques à preseve dans ma thèse sur le sujet. peut-être que vous pourriez ne pas apprécier maintenant que je n'ai pas lorsque je n'étais pas connu. je suis embêté pas à vous, mais les gens qui devraient savoir mieux que de les initier et de soutenir la pratique. l'espoir qui fait sens.Je ne parviens pas à trouver que
sed 's/;$//'
œuvres. Il ne veut pas couper quoi que ce soit, mais je me demande si c'est parce que le personnage que je suis en train de couper arrive à être un "$". Ce qui fonctionne pour moi estsed 's/.\{1\}$//'
.vous pouvez enlever les débuts et les fins d'une chaîne de N caractères à l'aide de cette bash construire, comme quelqu'un l'a déjà dit
CEPENDANT, ce n'est pas pris en charge dans les anciennes versions de bash.. comme je l'ai découvert juste en train d'écrire un script pour un Red hat EL6 processus d'installation. C'est la seule raison pour poster ici.
Un hacky façon d'y parvenir est d'utiliser sed avec extension de la regex comme ceci: