【问题标题】:Get text between, but not including, header and footer using awk or sed使用 awk 或 sed 在页眉和页脚之间获取文本,但不包括
【发布时间】:2018-08-08 19:56:27
【问题描述】:

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

1234
5678
start
stuff
stop
9871

我想获取页眉“开始”和页脚“停止”之间的数据,但包括这些边框(所以在这种情况下,我的结果将只是“东西”行)。使用 awk 和 sed,我尝试了以下方法:

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

但这些包括输出中的页眉和页脚。 我怎样才能做到不保留页眉和脚 - 而只保留两者之间的信息?

【问题讨论】:

    标签: text awk sed grep


    【解决方案1】:

    只需颠倒测试的顺序:

    $ awk '/stop/{show=0} show; /start/ { show=1 }' myfile.txt
    stuff
    

    工作原理

    • /stop/{show=0}

      每当我们遇到与正则表达式 stop 匹配的行时,我们都会将变量 show 设置为 0(假)。

    • show;

      如果show 为真,则打印该行。

      更详细地说,show 是一个条件,意味着它被评估,如果为真,则执行一个动作。由于我们没有明确指定一个动作,所以默认的动作是print $0

      由于没有明确指定操作,我们需要在show 后面加上; 以便将其与下一个命令分开。

    • /start/ { show=1 }

      每当我们遇到与正则表达式 start 匹配的行时,我们都会将变量 show 设置为 1 (true)。

    【讨论】:

    • 好东西!我只知道awk '/regex1/,/regex2/' file 包括regex1 和regex2。您能否稍微解释一下为什么awk '/regex2/ {var=0} var ; /regex1/ {var=1}' file 采用不同的地址,需要一个变量并使用; 而不是,
    • @JohnGoofy 我刚刚为答案添加了解释。构造 /regex1/,/regex2/ 是一个 range 并且,正如您所指出的,一个 range 并不能解决这个特定问题。因此,我们需要做一些完全不同的事情。
    • 干得好!这很好解释!非常感谢!
    【解决方案2】:

    使用 gnu sed

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

    【讨论】:

    • 我在 bash 中输入 bash: !d: event not found。我做错了什么?
    • @userunknown 你是对的,我的回声有问题,不一样。你的回声没问题,比如 echo "1234 ...9871" |\ my sed 在另一行。或使用 echo -e "1234\n5678\n... 或使用 printf '%s\n' "1234" "5678" .... 我认为这是回声问题,但我不确定。
    • @userunknown 也许您没有引用 sed 指令或使用双引号而不是单引号,即 bash 正在插入 sed 命令。
    • 我像你一样尝试过,使用 sed '...' 文件,并且有效。
    【解决方案3】:

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

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

    编程没有问题,用另一层sed解决不了。 :)

    【讨论】:

    • 如果有2组start和stop,你会得到错误的结果。
    • @ctac:嗯,没有任何暗示,可能会有不止一个这样的部分。如果第二个开始,在第一个结束之前怎么办?如果在开始或第二次开始之前有结束模式?在停止之前?
    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 2018-08-21
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多