PowerShell提取parallel代码块内容并移除外层结构需求
移除parallel外层结构保留内部内容的处理方案
原始输入内容
parallel ( { some content 1 some content 2 build ( 'Job3', parameter5: value5) some content 3 some content 4 } ) parallel ( { some content 5 some content 6 build ( 'Job2', parameter3: value3, parameter4: value4) } ) build ( 'Job1', parameter1: value1, parameter2: value2)
预期输出内容
some content 1 some content 2 build ( 'Job3', parameter5: value5) some content 3 some content 4 some content 5 some content 6 build ( 'Job2', parameter3: value3, parameter4: value4) build ( 'Job1', parameter1: value1, parameter2: value2)
处理方案
方法1:用awk脚本批量处理
写个简单的awk脚本就能搞定,步骤如下:
- 创建名为
process_parallel.awk的文件,内容如下:
BEGIN { in_parallel = 0; in_block = 0 } /^parallel \(/{ in_parallel = 1; next } /^\)/{ if (in_parallel) { in_parallel = 0; next } } /^\{/{ if (in_parallel) { in_block = 1; next } } /^\}/{ if (in_parallel && in_block) { in_block = 0; next } } { if (in_parallel && in_block) { sub(/^[[:space:]]+/, ""); print } else if (!in_parallel) { print } }
- 执行命令处理你的输入文件(假设输入文件叫
input.txt):
awk -f process_parallel.awk input.txt > output.txt
这个脚本逻辑很直白:
- 标记是否进入
parallel块和内部大括号区域 - 跳过所有外层的
parallel (、)、{、}符号 - 自动去掉
parallel内部内容的开头缩进后输出 - 直接保留并输出不在
parallel块里的代码
方法2:用sed命令快速处理
如果不想写脚本,也可以用sed的多行匹配命令一次性处理:
# 先提取parallel块内的内容并去除缩进 sed -n '/^parallel (/ { :loop; N; /)/!bloop; s/parallel (\n*{\n*\(.*\)\n*}\n*)/\1/g; s/^[[:space:]]*//mg; p }' input.txt > temp.txt # 再追加不在parallel块里的内容 sed -n '/^parallel (/!{/^)/!p}' input.txt >> temp.txt # 最后整理多余空行(可选) awk 'NF || prev {print; prev=NF}' temp.txt > output.txt rm temp.txt
内容的提问来源于stack exchange,提问作者Hemanth
相关产品推荐
相关产品推荐

