How to replace one character with two characters u

2019-04-03 05:34发布

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

标签: shell unix tr
5条回答
淡お忘
2楼-- · 2019-04-03 06:14

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
查看更多
戒情不戒烟
3楼-- · 2019-04-03 06:20

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
查看更多
贼婆χ
4楼-- · 2019-04-03 06:25

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.)

查看更多
Juvenile、少年°
5楼-- · 2019-04-03 06:30

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
查看更多
兄弟一词,经得起流年.
6楼-- · 2019-04-03 06:32
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'

--This will work perfect, since sed having a problem replacing \n

查看更多
登录 后发表回答