Vim正则表达式捕获组[bau ->byau:ceu ->cyeu]

epfja78i  于 2022-12-04  发布在  其他
关注(0)|答案(5)|浏览(179)

我有一个单词表:

bau
ceu
diu
fou
gau

我想把这个列表变成:

byau
cyeu
dyiu
fyou
gyau

我尝试命令失败:

:%s/(\w)(\w\w)/\1y\2/g

如果这不起作用,我必须做什么修改才能使regex捕获组在Vim中起作用?

voase2hg

voase2hg1#

解决此问题的一种方法是确保模式用 escaped 括号括起来:

:%s/\(\w\)\(\w\w\)/\1y\2/g

稍短一点的(而且更 magic-al)是使用\v,意思是在它之后的模式中除'0'-'9''a'-'z''A'-'Z''_'之外的所有ASCII字符都有特殊的含义:

:%s/\v(\w)(\w\w)/\1y\2/g

请参阅:

  • :help \(
  • :help \v
2hh7jdfx

2hh7jdfx2#

如果您不想用反斜杠来转义捕获组(这正是您所遗漏的),那么可以在前面添加\v,将Vim的正则表达式引擎转换为 very magic 模式:

:%s/\v(\w)(\w\w)/\1y\2/g
tzxcd3kk

tzxcd3kk3#

您也可以使用以下较短的模式:

:%s/^./&y
  • %s会将样式套用至整个档案。
  • ^.匹配行的第一个字符。
  • &y在模式后添加y
pzfprimi

pzfprimi4#

您还必须避开Grouping括号:

:%s/\(\w\)\(\w\w\)/\1y\2/g

这招管用。

11dmarpk

11dmarpk5#

Vim中,在一个***上选择***,如下

:'<,'>s/^\(\w\+ - \w\+\).*/\1/

:'<,'>s/\v^(\w+ - \w+).*/\1/

剖析
Space - Commercial - Boeing

Space - Commercial
同样地,
apple - banana - cake - donuts - eggs
被解析为
apple - banana

说明

  • ^:匹配行首
  • \-根据第一个正则表达式转义(+)(已接受的答案)--或者在前面加上\v(@ingo-karkat的答案)
  • \w\+查找单词(\w将查找第一个 * 字符 *):在本例中,我搜索了一个单词,然后是-,最后是另一个单词)
  • .*之后,需要撷取群组来寻找/比对/排除其馀文字
    **附录。**这有点离题,但我认为Vim不太适合执行更复杂的正则表达式/捕获。[我正在做类似于以下内容的事情,这就是我如何找到这个线程的。]

在这些情况下,最好将这些行转储到文本文件中,然后“就地”编辑它
x1米15英寸
或重定向
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/'
(note {1,2})允许灵活地查找单词的{x,y}个重复-参见https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html
在这里,由于我的短语是由-分隔的,我可以简单地调整这些参数来得到我想要的。

相关问题