如何用sed提取跨行指定字符串?优化命令清理冗余引号与换行
解决sed提取跨行目标字符串的问题
需求说明
需要提取CAKE_FROSTING("和",之间的字符串,若目标内容跨行,需移除换行及换行位置的引号,运行环境为Linux bash。
原命令
sed -En ':a;N;s/.*CAKE_FROSTING\(\n?\s*?"([^,]*).*/\1/p;ba' filesToCheck/* > result.txt
源文件内容(filesToCheck/file.h)
something CAKE_FROSTING( "is supreme", "[i][agree]") something else something more something else CAKE_FROSTING( "is."kinda" neat" "in fact", "[i][agree]") something else something more
当前输出(result.txt)
is supreme" is."kinda" neat" "in fact"
期望输出(result.txt)
is supreme is."kinda" neat in fact
修正后的sed命令
sed -En ':a;N;/",/!ba;s/.*CAKE_FROSTING\(\s*"([\s\S]*?)",/\1/;s/\n"/ /g;p' filesToCheck/* > result.txt
修改说明
- 调整跨行读取逻辑:使用
:a;N;/",/!ba循环读取行,直到模式空间中包含终止符",,确保一次性捕获完整的跨行目标内容,避免分段输出。 - 替换非贪婪匹配规则:用
[\s\S]*?替代原命令的[^,]*,[\s\S]匹配任意字符(包括换行),*?实现非贪婪匹配,精准捕获从起始"到第一个",之间的所有内容,不会提前中断。 - 移除跨行引号和换行:新增
s/\n"/ /g,将跨行位置的\n"替换为空格,既移除了换行和多余引号,又保证内容连贯。
内容的提问来源于stack exchange,提问作者JohnFreeman1212
相关产品推荐
相关产品推荐

