如何用Awk替换以§和¨分隔的多行代码块
用Awk替换Bash脚本头部指定块内容
问题说明
你的Bash脚本头部代码如下:
#!/bin/bash # ##################################### # # # {config_} # # # # ~/this_is_a very_very_very_long_filename # # # INSTALL VERSION # # # # §2023_06_18§ # # # # ¨version:50-0-1¨ # # # # ɸmodif_version:1-0-3ɸ # # # ##################################### # # Applications configuration files # ######################################################## # # # ######################################################## #
需要替换从第一个§开始,到第二个¨结束的代码块:
原块内容:
§2023_06_18§ # # # # ¨version:39-0-10¨
替换为:
§2024_07_18§ # # # # ¨version:43-1-00¨
Awk解决方案
以下是直接可用的Awk命令,逻辑清晰易懂:
awk ' BEGIN { in_block = 0 count_delim = 0 # 预存替换后的新内容,按行对应 new_content[1] = " §2024_07_18§ #" new_content[2] = " # #" new_content[3] = " # ¨version:43-1-00¨" } # 触发进入目标块:匹配第一个§ /§/ && count_delim == 0 { in_block = 1 count_delim++ print new_content[1] next } # 触发退出目标块:块内匹配到第二个¨ in_block && /¨/ { count_delim++ print new_content[3] in_block = 0 count_delim = 0 next } # 块内的中间行,输出对应新内容 in_block { print new_content[2] next } # 非块内容直接输出 1' your_script.sh > updated_script.sh
脚本逻辑解释
- 初始化(BEGIN段):设置标记变量
in_block(是否在目标块内)、count_delim(分隔符计数),同时把要替换的三行内容存在数组里。 - 进入块:当第一次匹配到
§时,切换到块内模式,直接输出新内容的第一行,跳过原行。 - 块内中间行:处于块内时,输出新内容的第二行,跳过原行。
- 退出块:在块内匹配到
¨时,输出新内容的第三行,退出块内模式,跳过原行。 - 其他行:最后一行的
1是Awk的简写,表示所有非块内的行直接原样输出。
使用方法
- 把命令中的
your_script.sh替换成你实际的脚本文件名。 - 执行命令后,会生成更新后的脚本
updated_script.sh,先检查内容无误后,再替换原文件即可。
内容的提问来源于stack exchange,提问作者jcdole
相关产品推荐
相关产品推荐

