Analysieren Sie eine Zeichenfolge mit mehreren speziellen Sternchen

Analysieren Sie eine Zeichenfolge mit mehreren speziellen Sternchen

Ich versuche, meine Eingabezeichenfolge in einem Skript mit zu analysieren, awkund 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 awkin 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

verwandte Informationen