Tengo una cadena como AxxBCyyyDEFzzLMN y quiero reemplazar todas las apariciones de x , y y z con _ .
¿Cómo puedo conseguir esto?
Sé que echo "$string" | tr 'x' '_' | tr 'y' '_'
funcionaría, pero quiero hacerlo de una vez, sin usar tuberías.
echo "$string" | tr xyz _
reemplazaría cada aparición de x
, y
o z
con _
, dando A__BC___DEF__LMN
su ejemplo.
echo "$string" | sed -r 's/[xyz]+/_/g'
reemplazaría las repeticiones de x
, y
o z
con una sola _
, dando A_BC_DEF_LMN
en su ejemplo.
,[]{}()~
caracteres. Quiero reemplazarlo con cada personaje especial escapado con '\'
¿cómo podría hacer esto con un disparo?
gsed
binario: $ brew install gnu-sed
luego$ gsed -r 's/[xyz]+/_/g'
sed -E
es (básicamente) equivalente a sed -r
en muchas distribuciones de Linux, si usa sed 's/[xyz][xyz]*/_/g'
no necesita la opción. Por supuesto, esto es equivalente a tr -s xyz _
lo que no hay necesidad real de sed
aquí.
tr
para eso. sed 's/[][{}()~,]/\\&/g'
pero realmente, haga una nueva pregunta si tiene una pregunta de seguimiento (por favor, siéntase libre de vincular aquí para referencia, por supuesto). Por cierto, ,
y ~
no son metacaracteres regex (aunque Bash y otros shells lo ~
expanden a $HOME
algunas posiciones; sin sh
embargo, no ).
Usando la expansión del parámetro Bash :
orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
bash
. Otros proyectiles podrían no funcionar (aunque algunos sí lo harán).
sed
si bash tiene una sustitución incorporada?
Puede encontrar útil este enlace:
http://tldp.org/LDP/abs/html/string-manipulation.html
En general,
Para reemplazar la primera coincidencia de $ substring con $ reemplazo:
${string/substring/replacement}
Para reemplazar todas las coincidencias de $ substring con $ reemplazo:
${string//substring/replacement}
EDITAR: tenga en cuenta que esto se aplica a una variable llamada $ string.
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter
^ use tantos de estos como necesite, y puede hacer su propio cifrado BÁSICO
Aquí hay una solución con expansión de parámetros de shell que reemplaza múltiples ocurrencias contiguas con una sola _
:
$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN
Observe que el patrón requiere una coincidencia de patrón extendida, activada con+(pattern)
shopt -s extglob
Alternativamente, con la -s
opción ("apretar") de tr
:
$ tr -s xyz _ <<< "$var"
A_BC_DEF_LMN
AxyzB
? ¿Tres guiones bajos o uno?tr '[xyz]'
reemplazará[
y]
, también. El argumento debería ser simplemente una lista de caracteres (aunque los rangos comoa-z
están bien, y en algunas implementaciones, las clases de caracteres POSIX como[:digit:]
).