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 dashcual, por lo general, las comillas seguras son comillas simples '"'"'.bashharí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 $IFSy $*.
set -f; IFS=\"\'\`; set -- $var; printf %s "$*"
SALIDA
"some ""crazy """"""""string ""here
Ahí lo acabo de printfver, pero por supuesto, si lo hubiera hecho:
var="$*"
... en lugar del printfcomando$var sería lo que ves en la salida allí.
Cuando le set -findico 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 $IFSvalores: $IFSespacios en blanco y $IFSno espacios en blanco. $IFSlos 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, $IFSmatrices 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 $IFScampos delimitados generados por $varla expansión de. Cuando se expande, sus valores constitutivos para los caracteres contenidos $IFSse 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 $IFScuando 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