【问题标题】:linux + cut file until specific wordlinux + 剪切文件直到特定单词
【发布时间】:2014-04-13 18:06:20
【问题描述】:

我有以下格式的文件

如何将文件剪切到以数字 2 开头的行(不包括第 2 行)

数字 2 的新行之前可以是空格或制表符,

remark - 可以使用 ksh 或 awk 或 sed 或 perl 一个 liner 等来实现

文件:

* 0    

 Any text
 Any text
 .
 .

 1

 Any text
 Any text
 .
 .

 2

 Any text
 Any text
 .
 .

 3

 Any text
 Any text
 .
 .

【问题讨论】:

  • 发布一些相关的输入数据和您的预期输出。

标签: perl sed awk ksh


【解决方案1】:

遇到要停靠的线路时只需exit

awk '/[[:space:]]*2/{exit}1' file

更新:[[:space:]] 将处理空格、制表符等。

【讨论】:

    【解决方案2】:

    使用 sed 删除匹配行之后(包括)的所有内容

    $ sed '/^[      ]*2/,$d' input.txt
    

    这是字符类中的空格和制表符。

    【讨论】:

    • \s* 也可以,我想我会很明显它处理以 WS 开头的行。
    【解决方案3】:

    您可以“玩”一个标志,当找到该行时该标志会停用:

    awk 'BEGIN{f=1} /^2/{f=0} f' file
    

    BEGIN{f=1} 将标志初始化为真。当行以2f 开头时,/^2/{f=0} 取消设置,如果为 true,则打印该行。

    要检查在一些空格后有2 的行,您可以这样做:

    awk 'BEGIN{f=1} /\s*2/{f=0} f' file
    

    【讨论】:

    • 注意 - 在数字 0 或 1 之前,我的字符“*”可能是其他字符
    • @Eytan 你是什么意思?唯一检查的条件是以 2 开头的行。
    • 这意味着 - 行首的数字 0 可能在其他字符之后
    • @Eytan 我还是不明白你的意思。您想从具有0 的第一行开始打印吗? 0 在您的示例输入中的重要性是什么?
    • 目标是打印到以数字 2 开头的行(不包括空格或制表符),因为数字 2 之前可能是空格或制表符
    【解决方案4】:

    Perl 单行:

    perl -pwe 'exit if $_ =~ /^\s*2/' file
    

    这允许在行首和数字2之间有任意数量的空格

    【讨论】:

      【解决方案5】:

      将指令 Q 与 sed 一起使用,这样它就不会在找到适当的结束行后解析文件的其余部分:

      sed '/^\s*2/Q' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多