Cela devrait le faire :
sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt
Où in.txt est :
"Fo'od'
'Food'
"Food"
"Fo"od'
Food
'Food"
"Food'
'Fo'od'
"Fo'od"
Fo'od
'Fo"od'
"Fo"od"
Fo"od
Et le fichier attendu.txt est :
"Fo'od'
Food
Food
"Fo"od'
Food
'Food"
"Food'
Fo'od
Fo'od
Fo'od
Fo"od
Fo"od
Fo"od
Vous pouvez vérifier qu'ils correspondent à :
diff -s <(sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt) expected.txt
Vous pouvez utiliser tr
:
echo "$string" | tr -d 'chars to delete'
... fonctionne également, mais 'tr' est connu pour être problématique sur des distributions beaucoup plus anciennes (environ Redhat 9-ish). tr
est une abréviation de 'translate', couramment utilisée dans les pipes pour transformer l'entrée. Le -d
option signifie simplement "supprimer".
La plupart des versions modernes contiennent également des macros prédéfinies pour transformer le haut en bas, le bas en haut, supprimer les espaces blancs, etc. est pratique.
VAR="'FOOD'"
VAR=$(eval echo $VAR)
Explication :puisque les guillemets sont déjà compris par le shell, vous pouvez demander au shell d'évaluer une commande qui fait juste écho à la chaîne entre guillemets, de la même manière qu'il le fait lorsque vous la tapez vous-même.
Ici, eval echo $VAR
se développe en eval echo 'FOOD'
car les guillemets font en fait partie de la valeur de VAR
. Si vous deviez exécuter echo 'FOOD'
dans le shell, vous obtiendrez FOOD
(sans les guillemets). C'est ce que eval
fait :il prend son entrée et l'exécute comme une commande shell.
⚠INJECTION DE CODE !
eval
exposer les scripts à l'injection de code.VAR=';ls -l' VAR=$(eval echo $VAR)
provoquera l'exécution de
ls -l
.Des codes beaucoup plus dangereux pourraient être injectés ici.