如何用awk或sed提取文件中首尾标记间的内容(不含标记)
我来帮你解决这个提取内容的问题!之前用awk或sed时带出了start和stop标记行,核心原因是没精准控制“跳过标记行、只输出中间内容”的逻辑,下面给你两种工具的正确实现方式:
用awk实现
最直观的方式是用状态标记法,通过一个变量控制什么时候输出内容:
awk '/start/{flag=1; next} /stop/{flag=0} flag' myfile.txt
逻辑解释:
- 当匹配到
start行时,把flag设为1,然后用next直接跳过当前行(不输出标记行) - 当匹配到
stop行时,把flag设为0,同样不输出这一行 - 只有当
flag为1时,才会输出当前行——也就是start之后、stop之前的所有内容
用sed实现
sed有两种常用写法,按需选择:
写法1:范围匹配+过滤标记行
sed -n '/start/,/stop/{/start\|stop/!p}' myfile.txt
逻辑解释:
-n表示只打印指定的行/start/,/stop/选中两个标记之间的所有行(包括标记行)- 块内的
/start\|stop/!p意思是:不匹配start或stop的行,才打印出来
写法2:循环跳过标记行(更高效)
适合处理大文件,避免遍历整个范围后再过滤:
sed -n '/start/{n; :a; /stop/!{p; n; ba}}' myfile.txt
逻辑解释:
- 找到
start行后,用n跳到下一行(直接跳过标记行) - 进入自定义循环
a:如果当前行不是stop,就打印它,再跳到下一行,继续循环;直到遇到stop行就退出循环
测试示例
假设myfile.txt内容如下:
line before start
start
first content line
second content line
stop
line after stop
用上面任意一种命令,输出都会是:
first content line second content line
内容的提问来源于stack exchange,提问作者ffConundrums
相关产品推荐
相关产品推荐

