如何修改sed命令,提取以')'为分隔符、可能跨行的PARM3参数?
解决sed提取跨行/同行参数的精准匹配问题
这个问题我之前也碰到过——sed的行级范围匹配在处理同一行内的结束标记时,很容易把后面无关的内容也包含进来。咱们可以调整sed的逻辑,让它精准停在第一个),的位置,不管这个结束标记是和PARM3在同一行,还是跨了多行。
修改后的sed命令
sed -n '/PARM3 = (/ { :match_loop s/\(.*),\).*/\1/ p /),/ q n b match_loop }' YOUR_FILE
命令逻辑拆解
咱们一步步看这个命令是怎么工作的:
-n:关闭sed的自动行打印,只输出我们指定的内容/PARM3 = (/:定位到包含PARM3参数开头的行,进入块处理:match_loop:定义一个循环标签,用来处理跨行的情况s/\(.*),\).*/\1/:核心替换——把当前行中第一个),之后的所有内容都删掉,只保留到结束标记为止的部分p:打印处理后的当前行/),/ q:如果当前行已经包含),(说明参数结束),直接退出sed,避免后续无关内容被处理- 如果当前行没有
),(说明参数跨行),用n读取下一行,然后通过b match_loop回到循环继续处理
测试两种场景
场景1:PARM3参数跨行(FILE1)
原内容:
... PARM3 = ( 'VALUE3A', 'VALUE3b', 'VALUE3n'), PARM4 = (...) ...
执行命令后,会输出:
PARM3 = ( 'VALUE3A', 'VALUE3b', 'VALUE3n'),
场景2:PARM3参数不跨行(FILE2)
原内容:
... PARM3 = ( 'VALUE3A'), PARM4 = ( 'VALUE4', .... 'VALUE4n'), ...
执行命令后,只会输出:
PARM3 = ( 'VALUE3A'),
完美避开了后面的PARM4内容。
内容的提问来源于stack exchange,提问作者et_phonehome
相关产品推荐
相关产品推荐

