Text 使用awk或sed获取页眉和页脚之间的文本,但不包括页眉和页脚

Text 使用awk或sed获取页眉和页脚之间的文本,但不包括页眉和页脚,text,awk,sed,grep,Text,Awk,Sed,Grep,假设我有一个文件myfile.txt,包含以下内容: 1234 5678 start stuff stop 9871 我希望获取页眉“开始”和页脚“停止”之间的数据,但不包括这些边框(因此在本例中,我的结果将是行“stuff”)。使用awk和sed,我尝试了以下方法: awk '/start/ { show=1 } show; /stop/ { show=0 }' myfile.txt sed -n '/start/,/stop/p' myfile.txt 但这些包括输出中的页眉和页脚我

假设我有一个文件myfile.txt,包含以下内容:

1234
5678
start
stuff
stop
9871
我希望获取页眉“开始”和页脚“停止”之间的数据,但包括这些边框(因此在本例中,我的结果将是行“stuff”)。使用awk和sed,我尝试了以下方法:

 awk '/start/ { show=1 } show; /stop/ { show=0 }' myfile.txt
 sed -n '/start/,/stop/p' myfile.txt

但这些包括输出中的页眉和页脚我如何才能做到不保留头部和脚部,而只保留中间的信息?

只需颠倒测试顺序即可:

$ awk '/stop/{show=0} show; /start/ { show=1 }' myfile.txt
stuff
工作原理
  • /stop/{show=0}

    每当遇到与regex
    stop
    匹配的行时,我们都会将变量
    show
    设置为0(false)

  • show

    如果
    show
    为真,则打印该行

    更详细地说,
    show
    是一个条件,意味着对其进行评估,如果为true,则执行操作。由于我们没有明确指定操作,因此执行的默认操作是
    print$0

    由于没有明确指定任何操作,我们需要使用
    遵循
    show
    以将其与下一个命令分开

  • /start/{show=1}

    每当遇到与regex
    start
    匹配的行时,我们都会将变量
    show
    设置为1(true)

使用gnu

sed '/start/,/stop/!d;//d' myfile.txt

另一个sed命令,但gnu sed也是:

echo "1234
5678
start
stuff
stop
9871" | sed -n '/start/,/stop/p' | sed '1d;$d' 
stuff

编程中没有问题,这是用另一层sed无法解决的。:)

我得到
bash:!d:在bash中输入时未找到事件
。我做错了什么?@userunknown你是对的,我对你的回音有问题,不一样。你的回音没问题,就像回音“1234…9871”\my sed在另一行上一样。或使用echo-e“1234\n5678\n…”或使用printf“%s\n”“1234”5678" .... 我认为这是一个回音问题,但我不确定。@userunknown可能您没有引用sed指令或使用双引号而不是单引号,即bash正在插入sed命令。我像您一样使用sed“…”文件进行了尝试,效果很好。如果有两组“开始”和“停止”,则会得到错误的结果。@ctac:没有任何提示,这样的部分可能不止一个。如果第二个开始,在第一个结束之前,该怎么办?在开始或第二次开始之前是否有结束模式?在停下来之前?太棒了!我刚刚知道
awk'/regex1/,/regex2/”文件
,其中包括regex1和regex2。你能解释一下为什么
awk'/regex2/{var=0}var/regex1/{var=1}'文件
采用不同的地址,需要变量并使用
而不是
?@johngofy我只是在答案中添加了一个解释。构造
/regex1/,/regex2/
是一个范围,正如您所指出的,范围并不能解决这个特殊问题。因此,我们需要做一些完全不同的事情。干得好!这是很好的解释!非常感谢你!