如何在Vim/Sed中将引号内空格替换为下划线(不修改外部空格)
Vim 和 Sed 解决方案:替换单引号内的空格为下划线
我来给你分享两个实用的解决方案,分别用Vim和Sed实现你的需求——只将单引号包裹的字符串内的空格替换成下划线,完全不改动引号外的空格。你之前尝试的Vim正则没成功,主要是没做到精准捕获引号内内容并针对性替换,下面的方法就能解决问题。
Vim 解决方案
Vim支持在替换命令中调用表达式,我们可以先捕获单引号内的所有内容,再单独替换其中的空格:
:%s/\v'([^']*)'/\=substitute(submatch(1), ' ', '_', 'g')/g
命令解释:
%s:对整个文件执行替换操作\v:启用“非常魔法”模式,简化正则语法(不需要转义大部分特殊字符)'([^']*)':匹配单引号包裹的内容,[^']*表示匹配除单引号外的任意字符,()将引号内的内容捕获为分组1\=:告诉Vim接下来要使用表达式进行替换substitute(submatch(1), ' ', '_', 'g'):调用Vim内置的substitute函数,把捕获到的分组1中的所有空格替换为下划线- 最后的
g:全局替换每行中的所有匹配项
如果想逐个确认替换,可以在命令末尾加c选项:
:%s/\v'([^']*)'/\=substitute(submatch(1), ' ', '_', 'g')/gc
Sed 解决方案
Sed需要通过循环处理来替换单引号内的所有空格(因为Sed默认一次只替换每行的第一个匹配项):
sed ":loop; s/'\([^']*\) \([^']*\)'/'\1_\2'/; t loop" your_file.txt
命令解释:
:loop:定义一个循环标签s/'\([^']*\) \([^']*\)'/'\1_\2'/:匹配单引号内的一个空格,将其替换为下划线,\1和\2分别捕获空格前后的内容t loop:如果上一次替换成功,跳回loop标签继续处理,直到该行单引号内没有空格为止
如果需要直接修改原文件(同时备份原文件),可以加-i.bak选项:
sed -i.bak ":loop; s/'\([^']*\) \([^']*\)'/'\1_\2'/; t loop" your_file.txt
效果验证
示例输入:
'wiUEF7-gvouw ow wo24-RTeih we', 'yt23IT iug-76'执行命令后得到的示例输出:
'wiUEF7-gvouw_ow_wo24-RTeih_we', 'yt23IT_iug-76'
内容的提问来源于stack exchange,提问作者Learning...
相关产品推荐
相关产品推荐

