Esto debería hacerlo:
sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt
Donde in.txt es:
"Fo'od'
'Food'
"Food"
"Fo"od'
Food
'Food"
"Food'
'Fo'od'
"Fo'od"
Fo'od
'Fo"od'
"Fo"od"
Fo"od
Y esperado.txt es:
"Fo'od'
Food
Food
"Fo"od'
Food
'Food"
"Food'
Fo'od
Fo'od
Fo'od
Fo"od
Fo"od
Fo"od
Puede comprobar que coinciden con:
diff -s <(sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt) expected.txt
Podrías usar tr
:
echo "$string" | tr -d 'chars to delete'
... también funciona, sin embargo, se sabe que 'tr' es problemático en distribuciones mucho más antiguas (alrededor de Redhat 9-ish). tr
es una abreviatura de 'traducir', comúnmente utilizada en tuberías para transformar la entrada. El -d
opción simplemente significa 'eliminar'.
La mayoría de las versiones modernas también contienen macros predefinidas para transformar de arriba a abajo, de abajo a arriba, eliminar espacios en blanco, etc. Por lo tanto, si lo usa, tómese un segundo para ver qué más hace (consulte la salida de ayuda / página de manual), viene muy bien.
VAR="'FOOD'"
VAR=$(eval echo $VAR)
Explicación:Dado que el shell ya entiende las comillas, puede pedirle al shell que evalúe un comando que solo repita la cadena entre comillas, de la misma manera que lo hace cuando lo escribe usted mismo.
Aquí, eval echo $VAR
se expande a eval echo 'FOOD'
porque las comillas son en realidad parte del valor de VAR
. Si tuviera que ejecutar echo 'FOOD'
en el shell obtendrías FOOD
(sin las comillas). Eso es lo que eval
hace:toma su entrada y la ejecuta como un comando de shell.
⚠¡INYECCIÓN DE CÓDIGO!
eval
exponga los scripts a la inyección de código.
VAR=';ls -l'
VAR=$(eval echo $VAR)
provocará la ejecución de ls -l
.
Aquí se podrían inyectar códigos mucho más dañinos.