Ich versuche, meine Eingabezeichenfolge in einem Skript mit zu analysieren, awk
und bin bei mehreren Sonderzeichen wie ***
und auf einige Einschränkungen gestoßen +++
.
Mit demselben Skript, mit :::
oder ---
als Trennzeichen, habe ich jedoch keine Probleme.
Mein Skript:
input=$1
delimiter=":::"
field2=$(echo "$input" | awk -F"$delimiter" '{print $2}')
field3=$(echo "$input" | awk -F"$delimiter" '{print $3}')
echo "field2=$field2"
echo "field3=$field3"
Ausgabe mit :::
als Trennzeichen:
bash-3.2$ ./parse_options.sh ":::sub option::: Main option, still:bla:"
field2=sub option
field3= Main option, still:bla:
Wenn ich nun versuche, es ***
als Trennzeichen zu verwenden, aber *
in meinem String „anderes“ isoliert habe, erhalte ich leider Folgendes: Es *bla*
wird als ein anderes Feld gezählt, und das ist nicht das, was ich möchte:
bash-3.2$ ./parse_options.sh "***sub option*** Main option, still*bla*"
field2=sub option
field3= Main option, still
Wie Sie sehen, *bla*
erscheint im dritten Feld nicht, da das in festgelegte Trennzeichen awk
in diesem Fall nicht beachtet wird.
Und das Gleiche gilt für die Verwendung +++
als Trennzeichen:
bash-3.2$ ./parse_options.sh "+++sub option+++ Main option, still+bla+"
field2=sub option
field3= Main option, still
Zur weiteren Erläuterung:
Eingabe=***sub option*** Main option, still*bla*
Erwartete Ausgabe=
field2=sub option
field3= Main option, still*bla*
Antwort1
#!/bin/bash
input=$1
delimiter='\\*\\*\\*'
field2=$(echo "$input" | awk -F"$delimiter" '{print $2}')
field3=$(echo "$input" | awk -F"$delimiter" '{print $3}')
echo "field2=$field2"
echo "field3=$field3"
$ ./parse_options.sh "***sub option*** Main option, still*bla*"
field2=sub option
field3= Main option, still*bla*
Weiterführende Literatur:
Antwort2
warum ersetzen Sie nicht *** oder +++ durch ein anderes Symbol und verwenden dieses dann als Trennzeichen
#!/bin/bash
input=$1
formatted_input=$(echo ${input} | sed "s/\*\*\*/\|/g;s/+++/\|/g")
field2=$(echo "${formatted_input}" | awk -F\| '{print $2}')
field3=$(echo "${formatted_input}" | awk -F\| '{print $3}')
echo "field2=$field2"
echo "field3=$field3"
Versuche dies...
$ echo "***test hello***hi test msg*this***" | awk -vFS='\\*\\*\\*' '{print "Field 2 : "$2;print "Field 3 : "$3}'
Field 2 : test hello
Field 3 : hi test msg*this