Skript zum Extrahieren von Text mit grep

Skript zum Extrahieren von Text mit grep

Ich versuche, zwei Textzeichenfolgen aus mehreren Datendateien in einem Verzeichnis zu extrahieren. Ich möchte die Textzeichenfolge mit einem ~-Zeichen trennen und die Ausgabe an eine einzelne Datei senden.

Beispielverzeichnisname: /xmldocs UND die Dateinamen sind Dateinamen: 1.xml, 2.xml,3.xml

Erwartete Ausgabe:

TEXT_STRING_ONE~TEXT_STRING_TWO   ------- This is from 1.xml
TEXT_STRING_ONE~TEXT_STRING_TWO   ------- This is from 2.xml
TEXT_STRING_ONE~TEXT_STRING_TWO   ------- This is from 3.xml

Das verwendete SCRIPT funktioniert mit nur einem Grep-Befehl

for i in `ls`
do
grep "Document ID:" $i
echo "~" 
echo "\n"
done >> /xmldocs/1.txt

Wenn ich den zweiten Grep-Befehl einfüge, grep 'CI[^"]' bleibt das Skript hängen und es erfolgt keine Ausgabe.

Der aktuelle Ausgang ist

<KMS_data id="KMS_documentId" name="Document ID:">12</KMS_data>
~
<KMS_data id="KMS_documentId" name="Document ID:">19</KMS_data>
~
<KMS_data id="KMS_documentId" name="Document ID:">6</KMS_data>
~


grep "Document ID:" $i
~


grep "Document ID:" $i
~


grep "Document ID:" $i > /xmldocs/1.txt
~

Ich bin für jede Hilfe dankbar. Ich bin noch sehr, sehr neu mit LINUX/UNIX-Befehlen und muss die Informationen aus 20.000 XML-Dateien extrahieren. Danke.

Antwort1

Die Idee ist, das Ergebnis von grep zu verarbeiten und es explizit an die Ausgabedatei anzuhängen. Auf diese Weise können Sie die Konsole verwenden, um Debugmeldungen zu schreiben.

#/bin/bash

# Save output to this file
outputFile='./xmldocs/1.txt'
rm -f $outputFile

# List only *.xml files and iterate
for i in `ls *.xml`
do
    # Echo which file is being processed (only printed to console )
    echo 'Processing :'$i
    # Grep, remove trailing newline and append to $outputFile
    grep "Document ID:" -s $i | tr -d '\n'  >> $outputFile
    # Add char to separate
    printf "~" >> $outputFile
    # Grep, remove trailing newline and append to $outputFile
    grep 'CI[^"]' -s $i | tr -d '\n' >> $outputFile
    # Print newline to separate results
    printf "\n" >> $outputFile
done 

echo '!! done'

Wenn dies nicht funktioniert, posten Sie bitte zum Testen die andere Zeile, die Sie greppen möchten.

Antwort2

Was Sie wollen, ist paste:

#!/bin/bash
for f in *.xml
do
    paste -d '~' <(grep 'Document ID:' "$f") <(grep 'CI[\^"]' "$f")
done > /xmldocs/1.txt

Antwort3

Was den Grund dafür angeht, warum das Skript bei Ihrer Verwendung von hängen bleiben kann grep 'CI[^"]', sollten Sie ^ maskieren. Die Verwendung von grep 'CI[\^"]'hat das Problem für mich behoben. Dies liegt daran, dass das Karottensymbol, selbst innerhalb von Klammern, als Negation interpretiert wird.

EDIT: Korrektur von Steeldriver

verwandte Informationen