In Awk, the range pattern is not an expression, so canot use the "!" to not it. so how to implement it (Printing all contents EXCEPT matching range pattern using awk)?
e.g.
$cat 1.t
abd
hfdh
#
fafa
deafa
123
#
end
the result I wanted:
cat 1.t
abd
hfdh
end
EDIT:
I gave an impertinent example. the endpattern should be different with the startpattern because I just have not test this. That's My fault.
At the same time, I want to operate the range pattern and the not range pattern differently. So sed is not my choice.
Is sed an alternative?
you just gave a tricky (I don't know I should call it good or bad ^_^ ) example. Your text have exactly same
startpattern
andendpattern
(#
)I guess you are looking for the same way as
sed '/#/,/#/d'
orsed -n '/#/,/#/!p'
There is some similiar (not same as sed's) address model in awk. In man page there is explanation. I said not same, your example is good one. if
start == end
the address model for awk won't work:because awk matches the same line (again check man page) but if they are different, see this example:
it will give what you want. so if this is the case, you could just do:
yes, quite similar as sed's one.
If the start and end are really same, you want to do it with awk, you need flag.
well, in example better use
^#$
, but that is not the point. I hope this answers your question.If you really need to use
awk
, something like this should work:Although the
sed
alternative might be a simpler approach (it's less typing, at least).Edit: @Kent pointed out you have the same start and end pattern, which makes it a bit more tricky, but this should work:
That basically toggles
x
every time it sees the pattern, and only prints whenx!=0
. Thenext
in there avoids printing the pattern when it's turning printing back on.