remove all lines from a text file starting at first empty line

前端 未结 5 1029
一生所求
一生所求 2020-12-18 16:17

What is the best way to remove all lines from a text file starting at first empty line in Bash? External tools (awk, sed...) can be used!

Example

1:          


        
相关标签:
5条回答
  • 2020-12-18 16:43

    Another awk would be:

    awk -vRS= '1;{exit}' file
    

    By setting the record separator RS to be an empty string, we define the records as paragraphs separated by a sequence of empty lines. It is now easily to adapt this to select the nth block as:

    awk -vRS= '(FNR==n){print;exit}' file
    

    There is a problem with this method when processing files with a DOS line-ending (CRLF). There will be no empty lines as there will always be a CR in the line. But this problem applies to all presented methods.

    0 讨论(0)
  • 2020-12-18 16:45

    With AWK:

    $ awk '/^$/{exit} 1' test.txt > output.txt
    

    Contents of output.txt

    $ cat output.txt 
    ABC
    DEF
    

    Walkthrough: For lines that matches ^$ (start-of-line, end-of-line), exit (the whole script). For all lines, print the whole line -- of course, we won't get to this part after a line has made us exit.

    0 讨论(0)
  • 2020-12-18 16:46

    Perl version

     perl -e '
            open $fh, ">","stuff";  
            open $efh, ">", "rest_of_stuff"; 
            while(<>){
               if ($_ !~ /\w+/){
                     $fh=$efh;
               } 
               print $fh $_;
             }
                ' demo
    

    This creates two output files and iterates over the demo data. When it hits a blank line, it flips the output from one file to the other.

    Creates

    stuff:

    ABC
    DEF
    

    rest_of_stuff:

    <blank line>
    GHI
    
    0 讨论(0)
  • 2020-12-18 16:47

    With GNU sed:

    sed '/^$/Q' "input_file.txt" > "output_file.txt" 
    
    0 讨论(0)
  • 2020-12-18 16:47

    Bet there are some more clever ways to do this, but here's one using bash's 'read' builtin. The question asks us to keep lines before the blank in one file and send lines after the blank to another file. You could send some of standard out one place and some another if you are willing to use 'exec' and reroute stdout mid-script, but I'm going to take a simpler approach and use a command line argument to let me know where the post-blank data should go:

    #!/bin/bash
    
    # script takes as argument the name of the file to send data once a blank line
    # found
    found_blank=0
    while read stuff; do
        if [ -z $stuff ] ; then
                found_blank=1
        fi
        if [ $found_blank ] ; then
                echo $stuff > $1
        else
                echo $stuff
        fi
    done
    

    run it like this:

    $ ./delete_from_empty.sh rest_of_stuff < demo
    

    output is:

    ABC
    DEF
    

    and 'rest_of_stuff' has

    GHI
    

    if you want the before-blank lines to go somewhere else besides stdout, simply redirect:

    $ ./delete_from_empty.sh after_blank < input_file > before_blank
    

    and you'll end up with two new files: after_blank and before_blank.

    0 讨论(0)
提交回复
热议问题