I\'m trying to match a pattern from piped input and/or a file, and then remove from the matched lines to the end of the file, inclusive. I\'ve looked everywhere, but can\'t
Here's a regular expression that I think will do what you want it to: ^(?:(?!Files:).)+|\s*-----THIS STUFF IS USELESS-----.+
Make sure to set the dotall flag.
Demo+explanation: http://regex101.com/r/xF2fN5
You only need to run this one expression.
why not
sed '/^-----THIS STUFF IS USELESS-----$/,$d' file
In a range expression like you have used, ',$' will specify "to the end of the file"
1 is first line in file,
$ is last line in file.
output
Files:
somefiles.tar.gz 1 2 3
somefiles.tar.gz 1 2 3
With GNU sed
, you can do
sed '/^-----THIS STUFF IS USELESS-----$/Q' file
where Q
is similar to q
quit command, but doesn't print the matching line
Dirty utility knife grep
version:
cat your_output.txt | grep -B 99999999 "THIS STUFF IS USELESS" | grep -v "THIS STUFF IS USELESS"
Instead of trying to figure out how to express what what you don't want, just print what you DO want:
awk -v RS= '/Files:/' file
EDIT: Given your modified input:
awk '/^Files:$/{f=1} f; /^$/{f=0}' file
or:
awk '/^Files:$/{f=1} f; /^-----THIS STUFF IS USELESS-----$/{f=0}' file
if you prefer.
You can also use either of these:
awk '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file
sed '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file
but they are hard to extend later.
sed -e '/^-----THIS STUFF IS USELESS-----$/,$ d'