I was wondering if with grep and regex we can do something in the spirit of the following example:
Original text:
name_1_extratext
name_2_extratext
Target:
name_extratext_1
name_extratext_2
I am particularly interested in doing this within Vim. Thanks
CodePudding user response:
grep doesn't "do" anything to what it matches; it only matches.
Use sed:
echo "name_1_extratext" | sed -E 's/_([^_] )_(.*)/_\2_\1/'
CodePudding user response:
@bohemian's comment about grep only doing matching also applies within Vim. "grep" and "regex" are not, or should not, be vague buzzwords you throw at a problem. They are tools that may or may not be adapted to the class of problem you are having and a large part of learning is acquiring the correct intuition for what tool to use in what case.
In Vim, what you want to do is a substitution. It doesn't involve grep at all but it definitely involves regular expressions.
In this specific case, you would do something like this:
:%s/\(.*\)\(_\d\ \)\(.*\)/\1\3\2
or this variant of @bohemian's answer:
:%s/_\([^_]\ \)_\(.*\)/_\2_\1/
or anything that works and makes sense to you, really. Ideally not something you copy/pasted from the internet but something you really understand.
Reference:
- The
:scommand is introduced in chapter 10 of the user manual::help 10.2, and further documented under:help :s. - The
%range is also introduced chapter 10 of the user manual::help 10.3, and further documented under:help :range. - Vim's own regular expression dialect is extensively documented under
:help pattern.
