如何替换模式M)与N)之间除首个空格外的所有空格?
搞定这个需求很简单!核心是精准定位M)到}N)的区间,然后只保留区间内的第一个空格,移除其余所有空格。下面给你几个常用工具的实现方案:
输入与预期效果
输入示例:
LINE1 LINE1 M) W1 W2 W3}N) REST LINE2 LINE2 SOME OTHER WORDS LINE3 LINE3 LINE3 M) Z1 Z2 Z3 Z4}N) REST
预期输出:
LINE1 LINE1 M) W1W2W3}N) REST LINE2 LINE2 SOME OTHER WORDS LINE3 LINE3 LINE3 M) Z1Z2Z3Z4}N) REST
Python 实现
用Python的re.sub配合回调函数,能灵活处理区间内的替换逻辑:
import re input_text = """LINE1 LINE1 M) W1 W2 W3}N) REST LINE2 LINE2 SOME OTHER WORDS LINE3 LINE3 LINE3 M) Z1 Z2 Z3 Z4}N) REST""" def clean_spaces_in_range(match): # 拆分匹配到的内容:M) + 第一个空格 + 后续内容 + }N) prefix = match.group(1) first_space = match.group(2) content = match.group(3) suffix = match.group(4) # 移除后续内容里的所有空格 cleaned_content = content.replace(" ", "") # 拼接成最终结果 return f"{prefix}{first_space}{cleaned_content}{suffix}" # 正则匹配M)到}N)的完整区间,捕获关键部分 result = re.sub(r'(M))(\s)(.*?)(}N)', clean_spaces_in_range, input_text) print(result)
逻辑说明:正则精准捕获M)、第一个空格、区间内的内容和}N),回调函数只清理区间内容里的所有空格,保留M)后的第一个空格。
Perl 实现
Perl的正则支持/e修饰符,允许替换部分直接写表达式,代码更简洁:
my $input_text = "LINE1 LINE1 M) W1 W2 W3}N) REST LINE2 LINE2 SOME OTHER WORDS LINE3 LINE3 LINE3 M) Z1 Z2 Z3 Z4}N) REST"; $input_text =~ s/(M))(\s)(.*?)(}N)/$1$2 . $3 =~ s/ //gr . $4/ge; print "$input_text\n";
逻辑说明:$3 =~ s/ //gr会把区间内的内容(W1 W2 W3这类)的空格全部移除,/e让Perl执行这个替换表达式,再拼接回原结构。
Sed 实现(GNU Sed)
如果用Shell环境的sed,可以通过循环替换来实现:
sed -E ':loop s/(M)[^}]* )([^ ]*) /\1\2/g t loop' input.txt
逻辑说明:定义一个循环标签:loop,每次替换M)之后、}N)之前的空格(除了第一个),直到没有可替换的空格为止,t loop表示替换成功就回到循环开头继续处理。
内容的提问来源于stack exchange,提问作者DonJ
相关产品推荐
相关产品推荐

