Bash: geschweifte Klammern unter einer Bedingung löschen

Bash: geschweifte Klammern unter einer Bedingung löschen

Ich möchte die geschweiften Klammern aus der folgenden Zeichenfolge entfernen, aber nur, wenn * sich zwischen ihnen etwas befindet.

Ich habe viele Antworten zu diesem Thema gefunden, aber in meinem Szenario möchte ich nur die Klammern löschen, bei denen die Bedingung erfüllt ist, d. h {*} --> *. .

name,apple,price,{50 70 80 80},color,{*}
name,orange,price,{*},color,{80 30 40}

erwartete Ausgabe:

name,apple,price,{50 70 80 80},color,*
name,orange,price,*,color,{80 30 40}

Bitte helfen Sie, Danke im Voraus.

Antwort1

Verwenden Sie den Befehl sedvon s(wie in „Ersatz“) – schließen Sie die geschweiften Klammern in das ein regexp, aber nicht in das replacement:

sed 's/{\*}/*/g'

Antwort2

Mit nur Bash

line='name,orange,price,{*},color,{80 30 40}'
s='{*}'
echo "${line//"$s"/*}"
name,orange,price,*,color,{80 30 40}

Ich konnte nicht herausfinden, wie ich das Escape-Zeichen so anbringen konnte, dass die sVariable nicht benötigt wurde.

Beachten Sie, dass die Anführungszeichen erforderlich sind. Andernfalls erhalten Sie:

$ echo "${line//$s/*}"
name,orange,price,*

Antwort3

Befehl

sed "/{\*}/s/{\*}/*/g" filename

Ausgabe

name,apple,price,{50 70 80 80},color,*
name,orange,price,*,color,{80 30 40}

Methode 2

awk '$0 ~ "{*}" {gsub (/{\*}/,"*",$0);print }'  filename

Ausgabe

name,apple,price,{50 70 80 80},color,*
name,orange,price,*,color,{80 30 40}

verwandte Informationen