Das sollte es tun:
sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt
Wo in.txt ist:
"Fo'od'
'Food'
"Food"
"Fo"od'
Food
'Food"
"Food'
'Fo'od'
"Fo'od"
Fo'od
'Fo"od'
"Fo"od"
Fo"od
Und erwartet.txt ist:
"Fo'od'
Food
Food
"Fo"od'
Food
'Food"
"Food'
Fo'od
Fo'od
Fo'od
Fo"od
Fo"od
Fo"od
Sie können überprüfen, ob sie übereinstimmen mit:
diff -s <(sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt) expected.txt
Sie könnten tr
verwenden :
echo "$string" | tr -d 'chars to delete'
... funktioniert auch, jedoch ist 'tr' bekanntermaßen problematisch bei viel älteren (etwa Redhat 9-ish) Distributionen. tr
ist eine Abkürzung für „übersetzen“, die häufig in Pipes verwendet wird, um Eingaben umzuwandeln. Die -d
Option bedeutet einfach „löschen“.
Die meisten modernen Versionen enthalten auch vordefinierte Makros, um obere in untere, untere in obere umzuwandeln, Leerzeichen zu entfernen usw. Wenn Sie es also verwenden, nehmen Sie sich eine Sekunde Zeit, um zu sehen, was es sonst noch tut (siehe Hilfeausgabe / Manpage), ist praktisch.
VAR="'FOOD'"
VAR=$(eval echo $VAR)
Erklärung:Da Anführungszeichen bereits von der Shell verstanden werden, können Sie die Shell bitten, einen Befehl auszuwerten, der nur die Zeichenfolge in Anführungszeichen zurückgibt, genauso wie Sie es tun, wenn Sie ihn selbst eingeben.
Hier, eval echo $VAR
erweitert sich zu eval echo 'FOOD'
weil die Anführungszeichen tatsächlich Teil des Werts von VAR
sind . Wenn Sie echo 'FOOD'
ausführen würden in die Shell würde man FOOD
bekommen (ohne die Anführungszeichen). Das ist eval
tut:es nimmt seine Eingabe und führt sie wie einen Shell-Befehl aus.
⚠CODE-INJEKTION!
eval
Skripte der Code-Injektion aussetzen.
VAR=';ls -l'
VAR=$(eval echo $VAR)
führt zur Ausführung von ls -l
.
Hier könnten viel schädlichere Codes eingeschleust werden.