Add text between two patterns in File using sed command

后端 未结 4 1245
既然无缘
既然无缘 2020-12-09 06:34

I want to add Some large code between two patterns:

File1.txt

This is text to be inserted into the File.

i

相关标签:
4条回答
  • 2020-12-09 07:08

    i think you can try this

    $ sed -n 'H;${x;s/Second.*\n/This is text to be inserted into the File\
    &/;p;}' infile.txt
    
    0 讨论(0)
  • 2020-12-09 07:13

    awk flavor:

    awk '/First/ { print $0; getline < "File1.txt" }1' File2.txt
    
    0 讨论(0)
  • 2020-12-09 07:28

    Since /r stands for reading in a file, use:

    sed '/First/r file1.txt' infile.txt
    

    You can find some info here: Reading in a file with the 'r' command.

    Add -i (that is, sed -i '/First/r file1.txt' infile.txt) for in-place edition.

    To perform this action no matter the case of the characters, use the I mark as suggested in Use sed with ignore case while adding text before some pattern:

    sed 's/first/last/Ig' file
    

    As indicated in comments, the above solution is just printing a given string after a pattern, without taking into consideration the second pattern.

    To do so, I'd go for an awk with a flag:

    awk -v data="$(<patt_file)" '/First/ {f=1} /Second/ && f {print data; f=0}1' file
    

    Given these files:

    $ cat patt_file
    This is text to be inserted
    $ cat file
    Some Text here
    First
    First
    Second
    Some Text here
    First
    Bar
    

    Let's run the command:

    $ awk -v data="$(<patt_file)" '/First/ {f=1} /Second/ && f {print data; f=0}1' file
    Some Text here
    First                             # <--- no line appended here
    First
    This is text to be inserted       # <--- line appended here
    Second
    Some Text here
    First                             # <--- no line appended here
    Bar
    
    0 讨论(0)
  • 2020-12-09 07:28

    Here's a cut of bash code that I wrote to insert a pattern from patt_file. Essentially had had to delete some repetitious data using uniq then add some stuff back in. I copy the stuff I need to put back in using lineNum values, save it to past_file. Then match patMatch in the file I'm adding the stuff to.

       #This pulls the line number from row k, column 2 of the reduced repitious file       
       lineNum1=$(awk -v i=$k -v j=2 'FNR == i {print $j}' test.txt)    
    
        #This pulls the line number from row k + 1, coulmn 2 of the reduced repitious file
        lineNum2=$(awk -v i=$((k+1)) -v j=2 'FNR == i {print $j}' test.txt)
    
        #This pulls fields row 4, 2 and 3 column into with tab spacing (important) from reduced repitious file 
        awk -v i=$k -v j=2 -v h=3 'FNR == i {print $j"  "$h}' test.txt>closeJ.txt
    
        #This substitutes all of the periods (dots) for \. so that sed will match them
        patMatch=$(sed 's/\./\\./' closeJ.txt)
    
        #This Selects text in the full data file between lineNum1 and lineNum2 and copies it to a file 
    
        awk -v awkVar1=$((lineNum1 +1)) -v awkVar2=$((lineNum2 -1)) 'NR >= awkVar1   && NR <= awkVar2 { print }' nice.txt >patt_file.txt 
    
        #This inserts the contents of the pattern matched file into the reduced repitious file              
        #The reduced repitious file will now grow
        sed -i.bak "/$patMatch/ r "patt_file.txt"" test.txt
    
    0 讨论(0)
提交回复
热议问题