user2616677
user2616677

Reputation:

removing unmatched lines with SED

I'm trying to remove everything but 3 separate lines with specific matching pattern and leave just the 3 lines I want

Here is my code;

sed -n '/matching pattern/matching pattern/matching pattern/p' > file.txt

Upvotes: 1

Views: 4166

Answers (5)

midori
midori

Reputation: 4837

If I understood you correctly:

sed -n '/\(pattern1\|pattern2\|pattern3\)/p' file > newfile

Upvotes: 0

potong
potong

Reputation: 58371

This might work for you (GNU sed):

sed '/pattern1/b;/pattern2/b;/pattern3/b;d' file

The normal flow of sed is to print what remains in the pattern space after processing. Therefore if the required pattern is in the pattern space let sed do its thing otherwise delete the line.

N.B. the b command is like a goto and if it has no following identifier, it means break out of any further sed commands and print (or not print if the -n option is in action) the contents of the pattern space.

Upvotes: 2

Todd A. Jacobs
Todd A. Jacobs

Reputation: 84343

Sed with Deletion

There's always more than one way to do this sort of thing, but one useful sed programming pattern is using alternation with deletion. For example:

# BSD sed
sed -E '/root|daemon|nobody/!d' /etc/passwd

# GNU sed
sed -r '/root|daemon|nobody/!d' /etc/passwd

This makes it possible to express ideas like "delete everything except for the listed terms." Even when expressions are functionally equivalent, it can be helpful to use a construct that most closely matches the idea you're trying to convey.

Upvotes: 2

karakfa
karakfa

Reputation: 67467

awk to the rescue!

awk '/pattern1/ || /pattern2/ || /pattern3/' filename

I think it's cleaner than alternatives.

Upvotes: 2

hek2mgl
hek2mgl

Reputation: 157947

If you have multiple commands on the same line, you need to separate the commands by a ;:

sed -n '/matching pattern/p;/matching pattern2/p;/matching pattern3/p' file

Alternatively you can put them onto separate lines:

sed -n '/matching pattern/p
        /matching pattern2/p
        /matching pattern3/p' file

Beside that, you can also use regex alternation:

sed -rn '/(pattern|pattern2|pattern3)/p' file

or (better) use grep:

grep -E '(pattern|pattern2|pattern3)' file

However, this might get messy if the patterns getting longer and more complicated.

Upvotes: 4

Related Questions