Questo dovrebbe farlo:
sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt
Dove in.txt è:
"Fo'od'
'Food'
"Food"
"Fo"od'
Food
'Food"
"Food'
'Fo'od'
"Fo'od"
Fo'od
'Fo"od'
"Fo"od"
Fo"od
E expected.txt è:
"Fo'od'
Food
Food
"Fo"od'
Food
'Food"
"Food'
Fo'od
Fo'od
Fo'od
Fo"od
Fo"od
Fo"od
Puoi verificare che corrispondano a:
diff -s <(sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt) expected.txt
Potresti usare tr
:
echo "$string" | tr -d 'chars to delete'
... funziona anche, tuttavia 'tr' è noto per essere problematico su distribuzioni molto più vecchie (circa Redhat 9-ish). tr
è l'abbreviazione di 'translate', comunemente usata nelle pipe per trasformare l'input. Il -d
opzione significa semplicemente 'cancella'.
La maggior parte delle versioni moderne contiene anche macro predefinite per trasformare da superiore a inferiore, da inferiore a superiore, uccidere lo spazio bianco, ecc. torna utile.
VAR="'FOOD'"
VAR=$(eval echo $VAR)
Spiegazione:poiché le virgolette sono già comprese dalla shell, puoi chiedere alla shell di valutare un comando che fa semplicemente eco alla stringa tra virgolette, allo stesso modo in cui lo fa quando lo digiti tu stesso.
Qui, eval echo $VAR
si espande in eval echo 'FOOD'
perché le virgolette fanno effettivamente parte del valore di VAR
. Se dovessi eseguire echo 'FOOD'
nella shell otterrai FOOD
(senza le virgolette). Questo è ciò che eval
fa:prende il suo input e lo esegue come un comando di shell.
⚠INIEZIONE DEL CODICE!
eval
esporre gli script all'iniezione di codice.VAR=';ls -l' VAR=$(eval echo $VAR)
provocherà l'esecuzione di
ls -l
.Codici molto più dannosi potrebbero essere iniettati qui.