如何使用sed和awk提取指定模式内容并处理转义换行符
解决非root用户下提取指定区间并替换转义换行的问题
原脚本存在几个核心问题:echo $sample_text未用双引号包裹变量导致字符串结构丢失、转义的\n未被转换为实际换行、sed替换逻辑未有效处理转义序列。以下是适配非root用户(依赖busybox工具)的两种解决方案:
方法一:用awk完成替换与提取
#!/bin/sh test="(cert_a='aaa',cert_b='-----START\nabcdEFGHij\nKLMN\nO/PqR\n-----END\n')This is a sample text.." echo "$test" | awk '{ gsub(/\\n/, "\n") if (/-----START/) { flag=1 } if (flag) { print } if (/-----END/) { flag=0 } }'
说明:
echo "$test"用双引号包裹变量,完整保留原字符串的所有字符(包括\n转义序列);gsub(/\\n/, "\n")将字符串中所有\n(反斜杠+字母n)替换为实际换行符;- 通过标记变量
flag精准控制,只输出-----START到-----END区间内的内容。
方法二:结合busybox sed完成替换与提取
#!/bin/sh test="(cert_a='aaa',cert_b='-----START\nabcdEFGHij\nKLMN\nO/PqR\n-----END\n')This is a sample text.." echo "$test" | busybox sed 's/\\n/\n/g' | busybox sed -n '/-----START/,/-----END/p'
说明:
- 第一步
sed 's/\\n/\n/g'批量将转义换行\n替换为实际换行; - 第二步
sed -n '/-----START/,/-----END/p'开启静默模式,仅打印匹配目标区间的内容。
两种方案均无需root权限,只要系统内置busybox的sed/awk工具即可正常运行,输出结果完全符合预期。
内容的提问来源于stack exchange,提问作者Preeti
相关产品推荐
相关产品推荐

