如何用正则仅修改多行文本中的USERLIST区块格式?
解决方案
Perl 实现
直接用 Perl 的多行模式读取整个文件,通过正则匹配并替换 USERLIST 区块:
perl -0777 -pe 's/USERLIST\s*\(\s*(.*?)\s*\)/USERLIST($1)/s; s/"\s*"/", "/g' input.txt
说明:
-0777:让 Perl 一次性读取整个文件内容,解决多行匹配问题。- 第一个替换:匹配
USERLIST (开头、)结尾的区块,把中间内容(非贪婪匹配)提取后放到USERLIST()中,/s修饰符允许.匹配换行符。 - 第二个替换:将区块内的引号加换行/空格的组合,替换成
", ",实现元素间的逗号分隔。
GNU Sed 实现
大部分 Linux 系统默认的 GNU Sed 支持多行匹配,可通过以下命令实现:
sed -n ' /USERLIST (/ { :loop N /)/! b loop s/\n\s*/ /g s/USERLIST ( /USERLIST(/ s/ "/", "/g s/ )/)/ p b } p' input.txt
说明:
/USERLIST (/:定位到 USERLIST 区块的起始行。:loop和N:循环读取后续行,直到遇到闭合括号)。s/\n\s*/ /g:把区块内的换行和多余空格替换成单个空格。- 后续几个替换分别处理括号前后的冗余空格、元素间的分隔格式,最终生成单行的 USERLIST 结构。
- 非 USERLIST 区块的行直接输出,保证 ROLELIST 等内容完全不变。
内容的提问来源于stack exchange,提问作者RodolfoAP
相关产品推荐
相关产品推荐

