Dr Jay
Dr Jay

Reputation: 425

Sed removing after ip

I have a simple sed question.

I have data like this:

boo:moo:127.0.0.1--¹óÖÝÊ¡µçÐÅ
foo:joo:127.0.0.1 ÁÉÄþÊ¡ÉòÑôÊвʺçÍø°É

How do I make it like this:

boo:moo:127.0.0.1
foo:joo:127.0.0.1

My sed code

sed -e 's/\.[^\.]*$//' test.txt

Thanks!

Upvotes: 0

Views: 75

Answers (2)

Sundeep
Sundeep

Reputation: 23697

For the given sample, you could capture everything from start of line till last digit in the line

$ sed 's/\(.*[0-9]\).*/\1/' ip.txt
boo:moo:127.0.0.1
foo:joo:127.0.0.1

$ grep -o '.*[0-9]' ip.txt
boo:moo:127.0.0.1
foo:joo:127.0.0.1

Or, you could delete all non-digit characters at end of line

$ sed 's/[^0-9]*$//' ip.txt
boo:moo:127.0.0.1
foo:joo:127.0.0.1

Upvotes: 1

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627469

You may find an IP like substring and remove all after it:

sed -E 's/([0-9]{1,3}(\.[0-9]{1,3}){3}).*/\1/' # POSIX ERE version
sed 's/\([0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}\).*/\1/'  # BRE POSIX version

The ([0-9]{1,3}(\.[0-9]{1,3}){3}) pattern is a simplified IP address regex pattern that matches and captures 1 to 3 digits and then 3 occurrences of a dot and again 1 to 3 digits, and then .* matches and consumes the rest of the line. The \1 placeholder in the replacement pattern inserts the captured value back into the result.

Note that in the BRE POSIX pattern, you have to escape ( and ) to make them a capturing group construct and you need to escape {...} to make it a range/interval/limiting quantifier (it has lots of names in the regex literature).

See an online demo.

Upvotes: 0

Related Questions