How do I replace a string with a newline using a bash script and sed?

后端 未结 7 2041
夕颜
夕颜 2021-02-13 09:41

I have the following input:

Value1|Value2|Value3|Value4@@ Value5|Value6|Value7|Value8@@ Value9|etc...

In my bash script I would like to replace

相关标签:
7条回答
  • 2021-02-13 10:21

    Using pure BASH string manipulation:

    eol=$'\n'
    line="${line//@@ /$eol}"
    
    echo "$line"
    Value1|Value2|Value3|Value4
    Value5|Value6|Value7|Value8
    Value9|etc...
    
    0 讨论(0)
  • 2021-02-13 10:21

    This wraps up using perl to do it, and gives some simple help.

    $ echo "hi\nthere"
    hi
    there
    
    $ echo "hi\nthere" | replace_string.sh e
    hi
    th
    re
    
    $ echo "hi\nthere" | replace_string.sh hi
    
    
    there
    
    $ echo "hi\nthere" | replace_string.sh hi bye
    bye
    there
    
    $ echo "hi\nthere" | replace_string.sh e super all
    hi
    thsuperrsuper
    

    replace_string.sh

    #!/bin/bash
    
    ME=$(basename $0)
    function show_help()
    {
      IT=$(cat <<EOF
    
      replaces a string with a new line, or any other string, 
      first occurrence by default, globally if "all" passed in
    
      usage: $ME SEARCH_FOR {REPLACE_WITH} {ALL}
    
      e.g. 
    
      $ME :       -> replaces first instance of ":" with a new line
      $ME : b     -> replaces first instance of ":" with "b"
      $ME a b all -> replaces ALL instances of "a" with "b"
      )
      echo "$IT"
      exit
    }
    
    if [ "$1" == "help" ]
    then
      show_help
    fi
    if [ -z "$1" ]
    then
      show_help
    fi
    
    STRING="$1"
    TIMES=${3:-""}
    WITH=${2:-"\n"}
    
    if [ "$TIMES" == "all" ]
    then
      TIMES="g"
    else
      TIMES=""
    fi
    
    perl -pe "s/$STRING/$WITH/$TIMES"
    
    0 讨论(0)
  • 2021-02-13 10:27

    This will work

    sed 's/@@ /\n/g' filename
    

    replaces @@ with new line

    0 讨论(0)
  • 2021-02-13 10:27

    If you don't mind to use perl:

    echo $line | perl -pe 's/@@/\n/g'
    Value1|Value2|Value3|Value4
     Value5|Value6|Value7|Value8
     Value9|etc
    
    0 讨论(0)
  • 2021-02-13 10:28

    I recommend using the tr function

    echo "$line" | tr '@@' '\n'
    

    For example:

    [itzhaki@local ~]$ X="Value1|Value2|Value3|Value4@@ Value5|Value6|Value7|Value8@@"
    [itzhaki@local ~]$ X=`echo "$X" | tr '@@' '\n'`
    [itzhaki@local ~]$ echo "$X"
    Value1|Value2|Value3|Value4
    
     Value5|Value6|Value7|Value8
    
    0 讨论(0)
  • 2021-02-13 10:31

    How about:

    for line in `echo $longline | sed 's/@@/\n/g'` ; do
        $operation1 $line
        $operation2 $line
        ...
        $operationN $line
        for field in `echo $each | sed 's/|/\n/g'` ; do
            $operationF1 $field
            $operationF2 $field
            ...
            $operationFN $field
        done
    done
    
    0 讨论(0)
提交回复
热议问题