shell - comando - tr bash
Cómo reemplazar un carácter con dos caracteres utilizando tr (5)
No, tr
está destinado específicamente a reemplazar caracteres individuales por caracteres individuales (o, según las opciones de la línea de comandos, eliminar caracteres o reemplazar ejecuciones de un solo carácter por una aparición).
sed
es probablemente la mejor herramienta para este trabajo en particular:
$ echo "asdlksad ~ adlkajsd ~ 12345" | sed ''s/~/~/n/g''
asdlksad ~
adlkajsd ~
12345
(Tenga en cuenta que esto requiere que sed
interprete la secuencia backlash-n /n
como un carácter de nueva línea. GNU sed hace esto, pero POSIX no lo especifica excepto dentro de una expresión regular, y definitivamente hay versiones más antiguas de sed
que no lo hacen .)
¿Se puede reemplazar un carácter por dos caracteres?
Estoy tratando de reemplazar "~" con "~ / n" pero la salida no produce la nueva línea.
$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~/n"
asdlksad ~ adlkajsd ~ 12345
no se puede hacer, lo siento
tr
está destinado a transliterar un personaje con otro.
Hay numerosas opciones, pero yo usaría awk
, es decir,
echo "asdlksad ~ adlkajsd ~ 12345" | awk ''{gsub(/[~]/, "&/n")};1''
salida
asdlksad ~
adlkajsd ~
12345
usted podría ir con awk, deje que la variable FS / OFS haga el trabajo por usted:
awk -F''~'' -v OFS="~/n" ''$1=$1''
prueba con tu ejemplo:
kent$ awk -F''~'' -v OFS="~/n" ''$1=$1'' <<< "asdlksad ~ adlkajsd ~ 12345"
asdlksad ~
adlkajsd ~
12345
tr
sólo puede hacer 1 a 1 traducción.
Aquí hay una forma de hacerlo usando Pure Bash:
s=''"asdlksad ~ adlkajsd ~ 12345''
r=$''~/n''
echo -e "${s///~/$r}"
asdlksad ~
adlkajsd ~
12345
echo "asdlksad ~ adlkajsd ~ 12345" | sed ''s/~/~|/g'' | tr ''|'' ''/n''
- Esto funcionará a la perfección, ya que estoy teniendo problemas para reemplazar / n