How to replace one character with two characters using tr

前端 未结 5 1509
栀梦
栀梦 2020-12-17 08:10

Can tr replace one character with two characters?

I am trying to replace \"~\" with \"~\\n\" but the output does not produce the newline.

$ echo \"a         


        
相关标签:
5条回答
  • 2020-12-17 08:12

    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
    
    0 讨论(0)
  • 2020-12-17 08:16

    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
    
    0 讨论(0)
  • 2020-12-17 08:16
    echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'
    

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

    0 讨论(0)
  • 2020-12-17 08:17

    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
    
    0 讨论(0)
  • 2020-12-17 08:37

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

    0 讨论(0)
提交回复
热议问题