Wie entkomme ich einem Symbol in einem Shell-Skript?

Wie entkomme ich einem Symbol in einem Shell-Skript?

Ich möchte Text mit einem Shell-Skript in eine andere Datei schreiben echo, aber die Daten werden nicht im genauen Format geschrieben, wie ich es beabsichtige

echo paste B01_reprojected_subset_comma_updated.csv  B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands.csv >> jobstext.sh

aber ich bekomme Text wie diesen in jobstext.sh

paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv,,,,,,,,,,,,,,

ich habe versucht, Sonderzeichen zu vermeiden, aber die Daten liegen trotzdem nicht im exakten Format vor.

kann mir jemand dabei helfen?

paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands1.csv

Antwort1

Um zu verhindern, dass die Shell Ihren Text (einschließlich Sonderzeichen wie $und >oder ) berührt *, setzen Sie alles in einfache Anführungszeichen. Um einfache Anführungszeichen in die Zeichenfolge aufzunehmen, müssen Sie die Zeichenfolge in Anführungszeichen unterbrechen und ein mit einem Backslash maskiertes einfaches Anführungszeichen hinzufügen, was zu folgendem Ergebnis führt 'here comes the embedded '\''quote':

echo 'paste B01_reprojected_subset_comma_updated.csv  B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '\''{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'\''>allbands.csv' >> jobstext.sh

Antwort2

Es ist einfacher, wenn Sie den Ausdruck aufteilen und printfFormatzeichenfolgen verwenden, um die Ausgabe zu ordnen. Zunächst der Paste-Befehl, der die Klammererweiterung nutzt:

printf "%s " paste B{01..12}_reprojected_subset_comma_updated.csv >> jobstext.sh

Dann der durch die Verwendung von OFS vereinfachte awk-Befehl:

printf "| %s '%s' %s %s '%s' > %s\n" awk -F',|\t' -v OFS=, '{print $1, $2, $3, $6, $9, $12, $15, $18, $21, $24, $27, $30, $33, $36, $39}' allbands1.csv >> jobstext.sh

Sie können auch verwenden %q, um die für verwendeten Formatzeichenfolgen zu vereinfachen printf.

Antwort3

Ohne ein Beispiel Ihrer Dateien oder eine klare Beschreibung dessen, was Sie tun möchten oder des gewünschten Formats der Ausgabedatei ist dies reine Vermutung. Vielleicht möchten Sie eine Befehlszeile (Inhalte einfügen|awk-Aktion) an die Datei jobstext.sh anhängen. Dies ließe sich besser mit einem Editor erledigen, um die Probleme mit verschachtelten Anführungszeichen zu vermeiden ...

In Ihrer Frage geht es jedoch um das Maskieren von Sonderzeichen. Eine Möglichkeit besteht darin, ein einfaches Anführungszeichen in doppelte Anführungszeichen zu setzen. Wenn Sie Ihre langen Dateinamen auf B01 usw. abkürzen, sieht das wie folgt aus.

echo 'paste B01 B02 B03 B04 B05 B06 B07 B08 B8A B09 B10 B11 B12 |
awk -F",||\t" '"'"'{print "$1","$2","$3","$6","$9","$12","$15","$18","$21",
"$24","$27","$30","$33","$36","$39}'"'"' >allbands.csv' >> jobstext.sh

Das erste einfache Anführungszeichen beginnt einen String, der den Einfügebefehl, Dateinamen, Pipe, awk und die Option F enthält. Dann '"'"'schließt das erste einfache Anführungszeichen der Sequenz den String, die nächsten 3 Zeichen definieren einen weiteren String mit einem einfachen Anführungszeichen und das letzte Zeichen ist ein einfaches Anführungszeichen, das einen dritten String beginnt (der die awk-Aktion in Klammern enthält). Eine ähnliche Sequenz aus 5 Anführungszeichen schließt diesen String, fügt ein weiteres einfaches Anführungszeichen ein und beginnt den fünften String (der aus der Umleitung der Ausgabe in allbands.csv besteht). Schließlich wird dieser String geschlossen (mit dem letzten Anführungszeichen der Zeile), sodass alle 5 Strings verkettet und an jobstext.sh angehängt werden.

Dies ist umständlich, aber das ist die Folge davon, wenn man versucht, zwei Ebenen einfacher Anführungszeichen in einer Befehlszeile zu verwenden. Die einfachen Anführungszeichen sind erforderlich, um zu verhindern, dass die awk-Anweisung von der Shell interpretiert wird.

Verbesserungen wären 1. die Verwendung von Dateinamen, die erweitert werden könnten *(aber Ihr „B8A“ führt eine Inkonsistenz ein, die eine einfache Dateinamenerweiterung verhindert) und 2. die Vereinfachung des Befehls durch Bearbeiten in jobstext.sh. Die Vorschläge in @murus Antwort sind eine Übernahme wert (aber seien Sie vorsichtig mit dieser „B8A“-Datei!)

verwandte Informationen