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 sed
von 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 s
Variable 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}