I'm using sed to remove tags in a configuration file, but I accidentally stumbled upon a problem, for which I'll use a basic example:
Contents of numbers.txt file:
0
1
2
3
4
5
6
7
8
9
Delete between two numbers (including the numbers themselves):
sed '/4/,/6/d' numbers.txt
Yields (as expected):
0
1
2
3
7
8
9
But if I remove the 6 line from numbers.txt, I would expect the same command to yield all of numbers.txt since it cannot find the second pattern, but instead it simply deletes everything after the 4 line (presumably because the search for 6 reached the end of the file, so that's the value it returns):
0
1
2
3
My question is: how do I modify the sed statement to simply do nothing in such an event?
This might work for you (GNU sed):
sed '/4/{:a;$!{N;/6/Md;ba}}' file
Build your own loop and only delete the accumulated lines in the pattern space if the end condition is met.
N.B. The M flag on the end condition to allow matches on multiple lines gathered up in the pattern space.
The /start/,/end/d is a control structure that upon finding start immediately deletes lines until end or the end of the file. Therefore there are two end conditions, the address /end/ or $. As the action (in this case deletion) is immediate, it can not be reversed if the /end/ condition is not met, for this reason the lines to be deleted need to gathered up and deleted or not depending on one of two conditions, either /end/( delete) or $ (do not delete).
/4/{...} start address of actions within the curly braces.:a the address of the start of a loop named a$!{...} if not the end of file actions within the curly braces.N append a newline and then the next line to the pattern space./6/Md end address and delete command if found i.e. this will delete all lines in the pattern space that have been appended by the N command.ba goto command, breaks to the loop address a. This enables the loop mechanism to continue until one of two conditions /6/ or$.N.B. If the end of file condition is met, the /4/{...} ends and the accumulated lines are printed as normal.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With