Can tr replace one character with two characters?
I am trying to replace "~" with "~\n" but the output does not produce the newline.
$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
Can tr replace one character with two characters?
I am trying to replace "~" with "~\n" but the output does not produce the newline.
$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
No, tr
is specifically intended to replace single characters by single characters (or, depending on command-line options, to delete characters or replace runs of a single character by one occurrence.).
sed
is probably the best tool for this particular job:
$ echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~\n/g'
asdlksad ~
adlkajsd ~
12345
(Note that this requires sed
to interpret the backlash-n \n
sequence as a newline character. GNU sed does this, but POSIX doesn't specify it except within a regular expression, and there are definitely older versions of sed
that don't.)
tr
can only do 1 to 1 translation.
Here is one way of doing that using pure Bash:
s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
adlkajsd ~
12345
you could go with awk, let FS/OFS variable do the job for you:
awk -F'~' -v OFS="~\n" '$1=$1'
test with your example:
kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345"
asdlksad ~
adlkajsd ~
12345
no can do, sorry.
tr
is meant to transliterate one character with another.
there are numerous options, but I would use awk
, i.e.
echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1'
output
asdlksad ~
adlkajsd ~
12345
/[~]/
, the shorter form /~/
also works. The ;1
at the end is not necessary. (Or is it, for some obscure old operating system?) –
Batton echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'
--This will work perfect, since sed having a problem replacing \n
|
elsewhere. –
Batton © 2022 - 2024 — McMap. All rights reserved.