How to replace a character within a matched pattern using ampersand (&)

前端 未结 4 1916
花落未央
花落未央 2021-02-01 07:05

When we match a pattern using sed, the matched pattern is stored in the \"ampersand\" (&) variable. IS there a way to replace a character in this matched pattern using the a

相关标签:
4条回答
  • 2021-02-01 07:13

    This might work for you (GNU sed and Bash):

    sed 's/apple1/sed "s|1|2|" <<<"&"/e' file
    
    0 讨论(0)
  • 2021-02-01 07:22

    If I guessed right, what you want to do is to apply a subsitution in a pattern matched. You can't do that using &. You want to do this instead:

    echo apple1 apple3 apple1 apple2 botemo1 | sed '/apple./ { s/apple1/apple2/g; }'
    

    This means that you want to execute the command substitution only on the lines that matches the pattern /apple./.

    0 讨论(0)
  • 2021-02-01 07:34

    you can first match a pattern and then change the text if matched:

    echo "apple1" | sed '/apple/s/1/2/'    # gives you "apple2"
    

    this code changes 1 to 2 in all lines containing apple

    0 讨论(0)
  • 2021-02-01 07:35

    You can also use a capture group. A capture is used to grab a part of the match and save it into an auxiliary variable, that is named numerically in the order that the capture appears.

    echo apple1 | sed -e 's/\(a\)\(p*\)\(le\)1/\1\2\32/g'
    

    We used three captures:

    1. The first one, stored in \1, contains an "a"
    2. The second one, stored in \2, contains a sequence of "p"s (in the example it contains "pp")
    3. The third one, stored in \3, contains the sequence "le"

    Now we can print the replacement using the matches we captured: \1\2\32. Notice that we are using 3 capture values to generate "apple" and then we append a 2. This wont be interpreted as variable \32 because we can only have a total of 9 captures.

    Hope this helps =)

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