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

北城余情 提交于 2019-12-02 20:34:08

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

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

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

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

sed 's/apple1/sed "s|1|2|" <<<"&"/e' file
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!