A continuación se muestra el fragmento de un script de shell de un script más grande. Elimina las comillas de la cadena que contiene una variable. Lo estoy haciendo usando sed, pero ¿es eficiente? Si no, ¿cuál es la forma eficiente?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. Esta sintaxis eliminará qoutes solo cuando haya un par coincidente.Respuestas:
Hay una manera más simple y eficiente, utilizando la función de eliminación de prefijo / sufijo de shell nativo:
${opt%\"}
eliminará el sufijo"
(se escapó con una barra diagonal inversa para evitar la interpretación de shell).${temp#\"}
eliminará el prefijo"
(se escapó con una barra diagonal inversa para evitar la interpretación de shell).Otra ventaja es que eliminará las comillas circundantes solo si hay comillas circundantes.
Por cierto, su solución siempre elimina el primer y el último carácter, sean los que sean (por supuesto, estoy seguro de que conoce sus datos, pero siempre es mejor estar seguro de lo que está eliminando).
Usando sed:
(Versión mejorada, como lo indica jfgagne, deshaciéndose del eco)
Por lo tanto, reemplaza un inicio
"
con nada y un final"
sin nada también. En la misma invocación (no hay necesidad de canalizar e iniciar otro sed.-e
puede tener procesamiento de texto múltiple).fuente
sed -e 's/^"//' -e 's/"$//' <<< $opt
.sed
podría usar una expresión regular única , o la sustitución de la variable podría estar envuelta en una líneacase $opt in '"'*'"') ... do it ... ;; esac
sed 's/^"\|"$//g'
Use tr para eliminar
"
:Nota : Esto elimina todas las comillas dobles, no solo al principio y al final.
fuente
Esto eliminará todas las comillas dobles.
fuente
Don't remove this \" quote
.:-(
Hay una manera sencilla de usar xargs :
xargs usa echo como el comando predeterminado si no se proporciona ningún comando y elimina las comillas de la entrada. Ver, por ejemplo, aquí .
fuente
echo '"quoted"' | xargs
->quoted
Puede hacerlo con solo una llamada a
sed
:fuente
El camino más corto : intente:
En realidad, elimina todas las
"
s (comillas dobles) deopt
(¿realmente habrá más comillas dobles que no sean al principio y al final? Entonces, en realidad es lo mismo, y mucho más breve ;-))fuente
Si está utilizando jq e intenta eliminar las comillas del resultado, las otras respuestas funcionarán, pero hay una mejor manera. Al usar la
-r
opción, puede generar el resultado sin comillas.fuente
jq
pero tenga en cuenta que no funciona si jq también está emitiendo salida ASCII con-a
(es un error al lado de jq)yq
también tiene-r
opción:yq -r '.foo' file.yml
Actualizar
Una respuesta simple y elegante de Stripping comillas simples y dobles en una cadena usando solo comandos bash / Linux estándar :
BAR=$(eval echo $BAR)
tiras de citas deBAR
.================================================== ===========
Basado en la respuesta de hueybois, se me ocurrió esta función después de mucho ensayo y error:
Si no desea imprimir nada, puede canalizar las evaluaciones a
/dev/null 2>&1
.Uso:
fuente
La solución más fácil en Bash:
Esto se llama expansión de subcadena (consulte el Manual de Gnu Bash y busque
${parameter:offset:length}
). En este ejemplo, la subcadenas
comienza desde la posición 1 y termina en la segunda última posición. Esto se debe al hecho de que silength
es un valor negativo, se interpreta como un desplazamiento hacia atrás desde el final deparameter
.fuente
Esta es la forma más discreta sin usar sed:
O
Salida:
Obtuve esto de una fuente .
fuente
Hay otra forma de hacerlo. Me gusta:
fuente
Mi version
La función acepta nombre (s) de variable y elimina comillas en su lugar. Solo elimina un par coincidente de comillas iniciales y finales. No comprueba si la cita final se escapa (precedida por
\
cual no se escapa).En mi experiencia, las funciones de utilidad de cadena de propósito general como esta (tengo una biblioteca de ellas) son más eficientes cuando se manipulan las cadenas directamente, no se utiliza ninguna coincidencia de patrones y, especialmente, no se crean subcapas ni se llaman herramientas externas como
sed
,awk
ogrep
.fuente
Sé que esta es una pregunta muy antigua, pero aquí hay otra variación de sed, que puede ser útil para alguien. A diferencia de algunos de los otros, solo reemplaza las comillas dobles al principio o al final ...
fuente