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.
J'utiliserais sed 's/;$//'
. par exemple:
COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | sed 's/;$//'`
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
foo="hello world"
echo ${foo%?}
hello worl
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
head
a été conçu, donc moins d'options en ligne de commande et une commande plus facile à lireJe 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
Si vous ne connaissez pas le dernier caractère, utilisez sed
:
$ grep company_name file.txt | cut -d '=' -f2 | sed 's/.$//'
"Abc Inc"
Ne pas abuser de cat
s. 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 )
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)
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 "\"*.*\""
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%??}
Dans Bash en utilisant un seul utilitaire externe:
IFS='= ' read -r discard COMPANY_NAME <<< $(grep "company_name" file.txt)
COMPANY_NAME=${COMPANY_NAME/%?}
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\}$//'
.
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
cat file.txt | grep "company_name" | cut -d '=' -f 2 | cut -d ';' -f 1