我有一个单词列表:
bau
ceu
diu
fou
gau
我想把那个列表变成:
byau
cyeu
dyiu
fyou
gyau
我尝试运行了以下命令,但未成功:
:%s/(\w)(\w\w)/\1y\2/g
鉴于这不起作用,我需要改变什么才能让Vim中的正则表达式捕获组起作用?
我有一个单词列表:
bau
ceu
diu
fou
gau
我想把那个列表变成:
byau
cyeu
dyiu
fyou
gyau
我尝试运行了以下命令,但未成功:
:%s/(\w)(\w\w)/\1y\2/g
鉴于这不起作用,我需要改变什么才能让Vim中的正则表达式捕获组起作用?
您也可以使用这个较短的模式:
:%s/^./&y
%s
将模式应用于整个文件。^.
匹配行的第一个字符。&y
在模式后添加 y
。&
实际上只是 \0
的另一个名称,它是包含整个匹配序列的捕获组。 - cuddlebugCuller如果你不想使用反斜杠来转义捕获组(这是你错过的部分),则在前面添加\v
,将Vim的正则表达式引擎切换为非常魔幻模式:
:%s/\v(\w)(\w\w)/\1y\2/g
:exmode
中可以正常工作;是否有办法在 gvim 查找/替换对话框中实现? - JJoao\v...
正则表达式可以很好地运行;在替换字符串中,&
可以工作,但\
被保护了(\1\r
丢失)。 - JJoaoinputdialog()
和一些Vimscript轻松构建自己的搜索和替换对话框(内部由:s
驱动)。 - Ingo Karkat:%s/\(\w\)\(\w\w\)/\1y\2/g
\v
版本,而不是在他们的正则表达式中逐个转义每一个小东西。 - CoffeeTableEspresso:'<,'>s/^\(\w\+ - \w\+\).*/\1/
:'<,'>s/\v^(\w+ - \w+).*/\1/
parses
Space - Commercial - Boeing
被解析为
Space - Commercial
同样地,
apple - banana - cake - donuts - eggs
被解析为
apple - banana
说明
^
:匹配行首\
-用于转义(
, +
, )
,按第一个正则表达式(接受的答案)-- 或在正则表达式前加上\v
(@ingo-karkat的答案)\w\+
查找单词(\w
只查找第一个字符):在此示例中,我搜索以一个单词后跟-
再跟随另一个单词的形式 .*
在捕获组之后需要加上,以查找/匹配/排除剩余的文本补充说明。这有点偏题,但我建议Vim不适合执行更复杂的正则表达式/捕获操作。[我正在执行类似以下内容的操作,这也是我找到这个主题的方式。]
在这些情况下,最好将行转储到文本文件中,并进行“就地”编辑。
sed -i ...
或者重定向到一个文件中:
sed ... > out.txt
在终端(或BASH脚本,...)中使用:
echo 'Space Sciences - Private Industry - Boeing' | sed -r 's/^((\w+ ){1,2}- (\w+ ){1,2}).*/\1/'
Space Sciences - Private Industry
cat in.txt
Space Sciences - Private Industry - Boeing
sed -r 's/^((\w+ ){1,2}- (\w+ ){1,2}).*/\1/' ~/in.txt > ~/out.txt
cat ~/out.txt
Space Sciences - Private Industry
## Caution: if you forget the > redirect, you'll edit your source.
## Subsequent > redirects also overwrite the output; use >> to append
## subsequent iterations to the output (preserving the previous output).
## To edit "in place" (`-i` argument/flag):
sed -i -r 's/^((\w+ ){1,2}- (\w+ ){1,2}).*/\1/' ~/in.txt
cat in.txt
Space Sciences - Private Industry
sed -r 's/^((\w+ ){1,2}- (\w+ ){1,2}).*/\1/'
(注意 {1,2}
允许查找一个词或两个词的重复 -- 参见 https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html。)
在这里,由于我的短语是由 -
分隔的,我可以简单地调整这些参数来得到我想要的结果。
:%norm ay<CR>
.”。翻译后为:“这句话与主题有些偏离,所以我把它放在评论中,但我会执行“:%norm ay<CR>”命令。” - romainll
键移动到第二列,在 Visual Block 模式下按Ctrl+v
进入,使用Shift+g
然后l
标记整个列,然后使用Shift+i
进入插入模式并输入 'y'。完成后需要按Esc
退出插入模式,总共只需 7 个按键操作。这里没有将其发布为答案,因为它实际上与捕获组无关(当我搜索到这个问题时,我正在寻找与捕获组有关的内容)。:) - LAFK says Reinstate Monica