web-dev-qa-db-fra.com

Comment supprimer le dernier caractère d'une sortie grep bash

COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2` 

sort quelque chose comme ça

"Abc Inc";

Ce que je veux faire, c'est que je veux supprimer le ";" ainsi que. Comment puis je faire ça? Je suis débutant à bash. Toute pensée ou suggestion serait utile.

41
liv2hak

J'utiliserais sed 's/;$//'. par exemple:

COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | sed 's/;$//'`
43
Laurence Gonsalves

Cela supprimera le dernier caractère contenu dans votre variable COMPANY_NAME, qu'il s'agisse ou non d'un point-virgule:

echo "$COMPANY_NAME" | rev | cut -c 2- | rev
52
ztank1013
foo="hello world"
echo ${foo%?}
hello worl
38
grokster

J'utiliserais head --bytes -1 ou head -c-1 en abrégé.

COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | head --bytes -1`

head affiche uniquement le début d'un flux ou d'un fichier. Généralement, il compte les lignes, mais vous pouvez également compter les caractères/octets. head --bytes 10 affichera les dix premiers caractères, mais head --bytes -10 affichera tout, sauf les dix derniers.

NB: vous pouvez avoir des problèmes si le caractère final est multi-octets, mais un point-virgule n'est pas

Je recommanderais cette solution à sed ou cut car

  • C'est exactement ce à quoi head a été conçu, donc moins d'options en ligne de commande et une commande plus facile à lire
  • Cela vous évite de penser aux expressions régulières, qui sont cool/puissantes mais souvent excessives
  • Cela évite à votre machine de penser aux expressions régulières et sera donc imperceptiblement plus rapide
20
Aaron J Lang

Je crois que le moyen le plus propre de retirer un seul caractère d'une chaîne avec bash est le suivant:

echo ${COMPANY_NAME:: -1}

mais je n'ai pas été en mesure d'intégrer la pièce grep dans les accolades, votre tâche particulière devient alors une double ligne:

COMPANY_NAME=$(grep "company_name" file.txt); COMPANY_NAME=${COMPANY_NAME:: -1} 

Cela supprimera tout caractère, point-virgule ou non, mais pourra également supprimer le point-virgule de manière spécifique… .. Pour supprimer TOUS les points-virgules, où qu'ils tombent:

echo ${COMPANY_NAME/;/}

Pour ne supprimer qu'un point-virgule à la fin:

echo ${COMPANY_NAME%;}

Ou, pour supprimer plusieurs points-virgules de la fin:

echo ${COMPANY_NAME%%;}

Pour plus de détails et plus d’informations sur cette approche, le Linux Documentation Project couvre de nombreux domaines à http://tldp.org/LDP/abs/html/string-manipulation.html

10
mightypile

Si vous ne connaissez pas le dernier caractère, utilisez sed:

$ grep company_name file.txt | cut -d '=' -f2 | sed 's/.$//'
"Abc Inc"
7
Det

Ne pas abuser de cats. Saviez-vous que grep peut aussi lire des fichiers?

L'approche canonique serait la suivante:

grep "company_name" file.txt | cut -d '=' -f 2 | sed -e 's/;$//'

l'approche plus intelligente utiliserait une seule instruction Perl ou awk, qui permet de filtrer et de transformer différentes transformations à la fois. Par exemple, quelque chose comme ceci:

COMPANY_NAME=$( Perl -ne '/company_name=(.*);/ && print $1' file.txt )
5
Anony-Mousse

ne pas avoir à enchaîner autant d'outils. Une seule commande awk fait le travail

 COMPANY_NAME=$(awk -F"=" '/company_name/{gsub(/;$/,"",$2) ;print $2}' file.txt)
3
kurumi

En supposant que les guillemets fassent réellement partie de la sortie, ne pouvez-vous pas simplement utiliser le commutateur -o pour tout renvoyer entre les guillemets?

COMPANY_NAME="\"ABC Inc\";" | echo $COMPANY_NAME | grep -o "\"*.*\""
1
Jens Bodal

Quelques raffinements pour répondre ci-dessus. Pour supprimer plus d'un caractère, vous devez ajouter plusieurs points d'interrogation. Par exemple, pour supprimer les deux derniers caractères de la variable $ SRC_IP_MSG, vous pouvez utiliser:

SRC_IP_MSG=${SRC_IP_MSG%??}
1
yuliskov

Dans Bash en utilisant un seul utilitaire externe:

IFS='= ' read -r discard COMPANY_NAME <<< $(grep "company_name" file.txt)
COMPANY_NAME=${COMPANY_NAME/%?}
1
Dennis Williamson

Je ne trouve pas que sed 's/;$//' fonctionne. Cela ne coupe rien, bien que je me demande si c'est parce que le personnage que j'essaie de couper est un "$". Ce qui fonctionne pour moi, c'est sed 's/.\{1\}$//'.

0
ktappe

vous pouvez effacer les débuts et les fins d'une chaîne de N caractères à l'aide de cette construction bash, comme quelqu'un l'a déjà dit

$ fred=abcdefg.rpm
$ echo ${fred:1:-4}
bcdefg

CEPENDANT, cela n’est pas pris en charge dans les anciennes versions de bash .. comme je l’ai découvert tout à l'heure en écrivant un script pour un processus d'installation de Red Hat EL6. C’est la seule raison pour laquelle vous postez ici .. Un moyen simple d’y parvenir est d’utiliser sed avec une expression rationnelle étendue comme ceci:

$ fred=abcdefg.rpm
$ echo $fred | sed -re 's/^.(.*)....$/\1/g'
bcdefg
0
Paul M
cat file.txt | grep "company_name" | cut -d '=' -f 2 | cut -d ';' -f 1
0
necromancer