You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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...

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:43:26