Si, por casualidad, solo está tratando de manejar las cotizaciones para reutilizar el shell, puede hacerlo sin eliminarlas, y también es muy simple:
aq() { sh -c 'for a do
alias "$((i=$i+1))=$a"
done; alias' -- "$@"
}
Ese shell de funciones cita cualquier matriz arg que le entregue e incrementa su salida por argumento iterable.
Aquí está con algunos argumentos:
aq \
"here's an
ugly one" \
"this one is \$PATHpretty bad, too" \
'this one```****```; totally sucks'
SALIDA
1='here'"'"'s an
ugly one'
2='this one is $PATHpretty bad, too'
3='this one```****```; totally sucks'
Esa salida es a partir de la dash
cual, por lo general, las comillas seguras son comillas simples '"'"'
.bash
haría '\''
.
Reemplazar una selección de bytes únicos, no espacios en blanco, no nulos con otro byte único probablemente se puede hacer más rápido en cualquier shell POSIX con $IFS
y $*
.
set -f; IFS=\"\'\`; set -- $var; printf %s "$*"
SALIDA
"some ""crazy """"""""string ""here
Ahí lo acabo de printf
ver, pero por supuesto, si lo hubiera hecho:
var="$*"
... en lugar del printf
comando$var
sería lo que ves en la salida allí.
Cuando le set -f
indico al shell que no se meta, en el caso de que la cadena contenga caracteres que podrían interpretarse como patrones globales. Hago esto porque el analizador de shells expande los patrones globales después de realizar la división de campo en las variables. globbing se puede volver a habilitar como set +f
. En general, en los scripts, me resulta útil configurar mi explosión como:
#!/usr/bin/sh -f
Y luego habilitar explícitamente globbing conset +f
cualquier línea que desee.
La división de campos se produce en función de los caracteres en $IFS
.
Hay dos tipos de $IFS
valores: $IFS
espacios en blanco y $IFS
no espacios en blanco. $IFS
los campos delimitados de espacios en blanco (espacio, tabulación, nueva línea) se especifican para eluir por secuencia a un solo campo (o ninguno en absoluto si no preceden a otra cosa) , así que ...
IFS=\ ; var=' '; printf '<%s>' $var
<>
Pero todos los demás están especificados para evaluar en un solo campo por ocurrencia ; no se truncan.
IFS=/; var='/////'; printf '<%s>' $var
<><><><><>
Todas las expansiones variables son, de forma predeterminada, $IFS
matrices de datos delimitadas; se dividen en campos separados según $IFS
. Cuando "
cita una, anula esa propiedad de matriz y la evalúa como una sola cadena.
Entonces cuando lo hago ...
IFS=\"\'\`; set -- $var
Estoy configurando la matriz de argumentos del shell en los muchos $IFS
campos delimitados generados por $var
la expansión de. Cuando se expande, sus valores constitutivos para los caracteres contenidos $IFS
se pierden , ahora son solo separadores de campo, lo son \0NUL
.
"$*"
- al igual que otras expansiones variables con comillas dobles - también anula las cualidades de división de campo de $IFS
. Pero, además , sustituye el primer byte $IFS
por cada campo delimitado en "$@"
. Así pues "
fue el primer valor en $IFS
todos los delimitadores posteriores se convierten "
en "$*"
. Y "
tampoco es necesario que lo separes $IFS
cuando lo dividas. Se podría alterar $IFS
después set -- $args
a otro valor en su totalidad y su nuevo primer byte A continuación, presentó a los delimitadores de campo en "$*"
. Además, puede eliminar todos los rastros de ellos por completo como:
set -- $var; IFS=; printf %s "$*"
SALIDA
some crazy string here
tr
. La PE de BASH es buena, pero tr es mucho más rápida en este caso. por ejemplo,echo "$OUTPUT" | tr -dc '[[:alpha:]]'
ya que solo desea tener alfanuméricos