2

To delete/comment 3 lines befor a pattern (including the line with the pattern):

how can i achive it through sed command

Ref: sed or awk: delete n lines following a pattern

the above ref blog help to achive the this with after a pattern match but i need to know before match


define host{
use                             xxx;
host_name                       pattern;
alias                           yyy;
address                         zzz;
}

the below sed command will comment the '#' after the pattern match for example

sed -e '/pattern/,+3 s/^/#/' file.cfg

define host{
use                             xxx;
#host_name                       pattern;
#alias                           yyy;
#address                         zzz;
#}

like this how can i do this for the before pattern?

can any one help me to resolve this

3 Answers3

2

If tac is allowed : tac|sed -e '/pattern/,+3 s/^/#/'|tac

If tac isn't allowed : sed -e '1!G;h;$!d'|sed -e '/pattern/,+3 s/^/#/'|sed -e '1!G;h;$!d' (source : http://sed.sourceforge.net/sed1line.txt)

fred_ glasses
  • 21
  • 1
  • 3
1

Reverse the file, comment the 3 lines after, then re-reverse the file.

tac file | sed '/pattern/ {s/^/#/; N; N; s/\n/&#/g;}' | tac
#define host{
#use                             xxx;
#host_name                       pattern;
alias                           yyy;
address                         zzz;
}

Although I think awk is a little easier to read:

tac file | awk '/pattern/ {c=3} c-- > 0 {$0 = "#" $0} 1' | tac
glenn jackman
  • 238,783
  • 38
  • 220
  • 352
1

This might work for you (GNU sed):

sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/s/^/#/mg;P;D' file

Gather up 4 lines in the pattern space and if the last line contains pattern insert # at the beginning of each line in the pattern space.

To delete those 4 lines, use:

sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/d;P;D' file

To delete the 3 lines before pattern but not the line containing pattern use:

sed ':a;N;s/\n/&/3;Ta;/pattern[^\n]*$/s/.*\n//;P;D'
potong
  • 55,640
  • 6
  • 51
  • 83