it-swarm.com.de

So entfernen Sie das letzte Zeichen aus einer Bash-Grep-Ausgabe

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

gibt so etwas aus

"Abc Inc";

Was ich tun möchte, ist, dass ich das nachgestellte ";" entfernen möchte. auch. Wie kann ich das machen? Ich bin ein Anfänger zum Schlagen. Alle Gedanken oder Vorschläge wären hilfreich.

41
liv2hak

Ich würde sed 's/;$//' verwenden. z.B:

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

Dadurch wird das letzte Zeichen in der COMPANY_NAME-Variable entfernt, unabhängig davon, ob es ein Semikolon ist oder nicht:

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

Ich würde head --bytes -1 oder kurz head -c-1 verwenden.

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

head gibt nur den Anfang eines Streams oder einer Datei aus. Normalerweise werden Zeilen gezählt, es können aber auch Zeichen/Bytes gezählt werden. head --bytes 10 gibt die ersten zehn Zeichen aus, aber head --bytes -10 gibt alles außer den letzten zehn aus.

NB: Sie haben möglicherweise Probleme, wenn das letzte Zeichen ein Multi-Byte-Zeichen ist, ein Semikolon jedoch nicht

Ich würde diese Lösung über sed oder cut empfehlen, weil

  • Es ist genau das, wofür head entwickelt wurde, also weniger Befehlszeilenoptionen und ein einfacher zu lesender Befehl
  • Es erspart Ihnen, über reguläre Ausdrücke nachzudenken, die cool/mächtig sind, aber oft übertrieben wirken
  • Es erspart Ihrem Gerät, über reguläre Ausdrücke nachzudenken, und wird dadurch unmerklich schneller
20
Aaron J Lang

Ich glaube, der sauberste Weg, ein einzelnes Zeichen mit bash aus einer Zeichenfolge zu entfernen, ist:

echo ${COMPANY_NAME:: -1}

aber ich konnte das grep-Stück nicht in die geschweiften Klammern einbetten, so dass Ihre spezielle Aufgabe zu einem Doppelliner wird:

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

Dadurch werden alle Zeichen (Semikolon oder nicht) entfernt, es kann jedoch auch das Semikolon entfernt werden. __ Um ALLE Semikolons zu entfernen, wo immer sie hinfallen,

echo ${COMPANY_NAME/;/}

So entfernen Sie nur ein Semikolon am Ende:

echo ${COMPANY_NAME%;}

Oder, um mehrere Semikolons vom Ende zu entfernen:

echo ${COMPANY_NAME%%;}

Für detaillierte Informationen und mehr zu diesem Ansatz bietet das Linux Documentation Project eine Vielzahl von Möglichkeiten unter http://tldp.org/LDP/abs/html/string-manipulation.html

10
mightypile

Verwenden Sie sed, wenn Sie nicht wissen, was das letzte Zeichen tatsächlich ist:

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

Missbrauche nicht cats. Wussten Sie, dass grep auch Dateien lesen kann?

Der kanonische Ansatz wäre folgender:

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

der intelligentere Ansatz würde eine einzige Perl- oder awk-Anweisung verwenden, die gleichzeitig Filter und verschiedene Transformationen ausführen kann. Zum Beispiel so etwas:

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

muss nicht so viele Werkzeuge verketten. Nur ein awk-Befehl erledigt die Aufgabe

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

Angenommen, die Anführungszeichen sind Teil der Ausgabe. Können Sie nicht einfach die Option -o verwenden, um alles zwischen den Anführungszeichen zurückzugeben?

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

Einige Verfeinerungen, um oben zu antworten. Um mehrere Zeichen zu entfernen, fügen Sie mehrere Fragezeichen hinzu. Um beispielsweise die letzten beiden Zeichen aus der Variablen $ SRC_IP_MSG zu entfernen, können Sie Folgendes verwenden:

SRC_IP_MSG=${SRC_IP_MSG%??}
1
yuliskov

In Bash mit nur einem externen Dienstprogramm:

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

Ich finde nicht, dass sed 's/;$//' funktioniert. Es schneidet nichts, obwohl ich frage mich, ob der Charakter, den ich zu trimmen versucht, zufällig ein "$" ist. Was für mich funktioniert, ist sed 's/.\{1\}$//'.

0
ktappe

sie können den Anfang und das Ende eines Strings mit N-Zeichen mit diesem bash-Konstrukt entfernen, wie bereits gesagt wurde

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

Dies wird jedoch in älteren bash-Versionen nicht unterstützt. Wie ich gerade entdeckte, schrieb ich gerade ein Skript für einen Red Hat EL6-Installationsprozess. Dies ist der einzige Grund, um hier zu posten .. Ein hackiger Weg, dies zu erreichen, ist die Verwendung von sed mit erweitertem Regex wie folgt:

$ 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