usar usa tutorial que para instalar index funciona elastic crear como comandos linux bash quotes quoting

tutorial - Eliminar comillas simples y dobles en una cadena usando solo comandos bash/estándar de Linux



para que se usa elastic search (7)

Estoy buscando algo que traduzca una cadena de la siguiente manera, usando solo comandos bash / estándar de Linux:

  1. Deben eliminarse las comillas simples que rodean una cadena
  2. Deben eliminarse las comillas dobles que rodean una cadena
  3. Las cadenas sin comillas deben seguir siendo las mismas
  4. Las cadenas con comillas circundantes no coincidentes deben seguir siendo las mismas
  5. Las comillas simples que no rodean la cadena deben permanecer
  6. Las comillas dobles que no rodean la cadena deben permanecer

Por ejemplo:

  • La ''comida'' debería convertirse en comida
  • "La comida" debería convertirse en comida
  • La comida debe seguir siendo la misma.
  • ''Comida'' debería seguir siendo la misma
  • "La comida" debería seguir siendo la misma
  • ''Fo''od'' debería convertirse en Fo''od
  • "Fo''od" debería convertirse en Fo''od
  • Fo''od debería seguir siendo el mismo
  • ''Fo "od'' debería convertirse en Fo" od
  • "Fo" od "debería convertirse en Fo" od
  • Fo "od debería permanecer igual

¡Gracias!


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 espera.txt es:

"Fo''od'' Food Food "Fo"od'' Food ''Food" "Food'' Fo''od Fo''od Fo''od Fo"od Fo"od Fo"od

Puedes verificar que coincidan 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. La opción -d simplemente significa ''borrar''.

La mayoría de las versiones modernas también contienen macros predefinidas para transformar de arriba a abajo, de abajo a arriba, eliminar el espacio en blanco, etc. Por lo tanto, si lo usa, tómese un segundo para ver qué más hace (consulte la página de ayuda / página de ayuda), Viene muy bien.


Probablemente quieras usar sed ...

echo $mystring | sed -s "s/^/(/(/"/(.*/)/"/)/|/(''/(.*/)''/)/)/$///3//5/g"


Sólo tropezé con esto también. Para los primeros tres casos de prueba, eval echo $string funciona bien. Para que funcione para todos los casos solicitados y algunos otros, se me ocurrió esto (probado con bash y dash ):

#!/bin/sh stripquotes() { local firstchar="`substr "$1" 0 1`" local len=${#1} local ilast=$((${#1} - 1)) local lastchar="`substr "$1" $(($len - 1))`" if [ "$firstchar" = ''"'' ] || [ "$firstchar" = "''" ] && [ $firstchar = $lastchar ]; then echo "`substr "$1" 1 $(($len - 2))`" else echo "$1" fi } # $1 = String. # $2 = Start index. # $3 = Length (optional). If unspecified or an empty string, the length of the # rest of the string is used. substr() { local "len=$3" [ "$len" = '''' ] && len=${#1} if ! (echo ${1:$2:$len}) 2>/dev/null; then echo "$1" | awk "{ print(substr(/$0, $(($2 + 1)), $len)) }" fi } var="''Food''" stripquotes "$var" var=''"Food"'' stripquotes "$var" var=Food stripquotes "$var" var=/'Food/" stripquotes "$var" var=/"Food/' stripquotes "$var" var="''Fo''od''" stripquotes "$var" var="/"Fo''od/"" stripquotes "$var" var="Fo''od" stripquotes "$var" var="''Fo/"od''" stripquotes "$var" var="/"Fo/"od/"" stripquotes "$var" var="Fo/"od" stripquotes "$var" # A string with whitespace should work too. var="''F/"o ''o o o'' o/"d''" stripquotes "$var" # Strings that start and end with the same character that isn''t a quote or # doublequote should stay the same. var="TEST" stripquotes "$var" # An empty string should not cause errors. var= stripquotes "$var" # Strings of length 2 that begin and end with a quote or doublequote should not # cause errors. var="''''" stripquotes "$var" var=''""'' stripquotes "$var"


Simplemente utilizando Bash builtins (es decir, expansión de parámetros de Bash):

IFS='' '' food_strings=( "''Food''" ''"Food"'' Food "''Food/"" "/"Food''" "''Fo''od''" "/"Fo''od/"" "Fo''od" "''Fo/"od''" ''"Fo"od"'' ''Fo"od'' ) for food in ${food_strings[@]}; do [[ "${food#/'}" != "$food" ]] && [[ "${food%/'}" != "$food" ]] && { food="${food#/'}"; food="${food%/'}"; } [[ "${food#/"}" != "$food" ]] && [[ "${food%/"}" != "$food" ]] && { food="${food#/"}"; food="${food%/"}"; } echo "$food" done

Para otro ejemplo de expansión de parámetros de Bash vea:

http://codesnippets.joyent.com/posts/show/1816


VAR="''FOOD''" VAR=$(eval echo $VAR)

Explicación: dado que el shell ya comprende las comillas, puede pedirle al shell que evalúe un comando que simplemente hace un eco de la cadena entre comillas, de la misma manera que lo hace cuando lo escribe usted mismo.

Aquí, eval echo $VAR expande a eval echo ''FOOD'' porque las citas son en realidad parte del valor de VAR . Si tuviera que ejecutar echo ''FOOD'' en el shell, obtendría FOOD (sin las comillas). Eso es lo que hace eval : toma su entrada y la ejecuta como un comando de shell.


python -c "import sys;a=sys.stdin.read();a=a.strip();print (a[1:-1] if a[0]==a[-1] and a[0] in /"''///"/" else a)"

no maneja casos de borde extremadamente bien (como una cadena vacía), pero servirá como punto de partida. Funciona separando el carácter frontal y posterior si son iguales y si son "o"