How to replace one character with two characters using tr

喜夏-厌秋 提交于 2019-12-05 12:05:32

问题


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

回答1:


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




回答2:


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



回答3:


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:


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



回答5:


echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'

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



来源:https://stackoverflow.com/questions/18365482/how-to-replace-one-character-with-two-characters-using-tr

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!