¿Desea reemplazar cualquier secuencia de x, y's o z's consecutivas con un guión bajo, o desea reemplazar cada x, y o z con un guión bajo? Además, ¿qué pasa con las secuencias mixtas, como AxyzB? ¿Tres guiones bajos o uno?
David Z
tr '[xyz]'reemplazará [y ], también. El argumento debería ser simplemente una lista de caracteres (aunque los rangos como a-zestán bien, y en algunas implementaciones, las clases de caracteres POSIX como [:digit:]).
tripleee
Respuestas:
329
echo "$string"| tr xyz _
reemplazaría cada aparición de x, yo zcon _, dando A__BC___DEF__LMNsu ejemplo.
echo "$string"| sed -r 's/[xyz]+/_/g'
reemplazaría las repeticiones de x, yo zcon una sola _, dando A_BC_DEF_LMNen su ejemplo.
En Mac, obtuve lo siguiente: sed: opción ilegal - uso de r: secuencia de comandos sed [-Ealn] [-i extensión] [archivo ...] sed [-Ealn] [-i extensión] [-e secuencia de comandos]. .. [-f script_file] ... [file ...]
catanore el
Tengo una cadena que contiene ,[]{}()~caracteres. Quiero reemplazarlo con cada personaje especial escapado con '\'¿cómo podría hacer esto con un disparo?
inckka
2
@halakala Mac viene con una versión ligeramente diferente de sed. Vea esta pregunta: unix.stackexchange.com/questions/13711/… En su lugar, puede instalar "gnu-sed" con el administrador de paquetes Homebrew y luego usar el gsedbinario: $ brew install gnu-sedluego$ gsed -r 's/[xyz]+/_/g'
John Kary
66
En * BSD (y, por lo tanto, OSX), sed -Ees (básicamente) equivalente a sed -ren 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 sedaquí.
tripleee
@inckka No puedes usar trpara 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 $HOMEalgunas posiciones; sin shembargo, no ).
@Alexey, mi ejemplo funciona para mí (bash 4.3.11 (1) -release). Asegúrate de estar usando bash. Otros proyectiles podrían no funcionar (aunque algunos sí lo harán).
Matthew Flaschen
Gracias @MatthewFlaschen. Esto era exactamente lo que necesitaba para hacer un reemplazo de sed por una ruta absoluta en un script bash (reemplazando el / con \ / así sed lo acepta).
Ryan G
1
@RyanG ¿por qué usar sedsi bash tiene una sustitución incorporada?
MestreLion
@MestreLion Eso puede haber salido mal, pero necesitaba reemplazar un nombre de variable estándar en un grupo de archivos con una ruta absoluta, para lo cual estaba usando el reemplazo de sed in situ. pero no puede tener "/" sin escapar de él en el comando. Estaba encadenando las operaciones juntas en bash. ¿No sería esta la mejor manera de manipular una cadena en bash?
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:]
).Respuestas:
reemplazaría cada aparición de
x
,y
oz
con_
, dandoA__BC___DEF__LMN
su ejemplo.reemplazaría las repeticiones de
x
,y
oz
con una sola_
, dandoA_BC_DEF_LMN
en su ejemplo.fuente
,[]{}()~
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 ased -r
en muchas distribuciones de Linux, si usased 's/[xyz][xyz]*/_/g'
no necesita la opción. Por supuesto, esto es equivalente atr -s xyz _
lo que no hay necesidad real desed
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; sinsh
embargo, no ).Usando la expansión del parámetro Bash :
fuente
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:
Para reemplazar todas las coincidencias de $ substring con $ reemplazo:
EDITAR: tenga en cuenta que esto se aplica a una variable llamada $ string.
fuente
^ use tantos de estos como necesite, y puede hacer su propio cifrado BÁSICO
fuente
Aquí hay una solución con expansión de parámetros de shell que reemplaza múltiples ocurrencias contiguas con una sola
_
:Observe que el patrón requiere una coincidencia de patrón extendida, activada con
+(pattern)
Alternativamente, con la
-s
opción ("apretar") detr
:fuente