Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

how to delete all characters in file except numbers and "." , each word (numbers/dot) should be in new line in file see example2

  • the solution can be with sed or awk or ksh syntax

remark - the solution must be according to the example 2

example 1

file before edit

  192.0.22.1++0.1
  e32)5.500.5.5*kjcdr
  ##@$1.1.1.1+++jmjh
  1.1.1.1333
  33331.1.1.1
  @5.5.5.??????
  ~3de.ede5.5.5.5
  1.1.1.13444r54
  192.9.30.174
  &&^#%5.5.5.5
  :5.5.5.5@%%^^&*
  :5.5.5.5:
  **22.22.22.22
  172.78.0.1()*5.4.3.277
  3.3.3ki.3.

example 2 of file after delete all characters except numbers and "." charter , each new word will be in new line

  192.0.22.1
  0.1
  32 5.500.5.5
  1.1.1.1
  1.1.1.1333
  33331.1.1.1
  5.5.5.
  .
  5.5.5.5
  1.1.1.13444
  54
  192.9.30.174
  5.5.5.5
  5.5.5.5
  5.5.5.5
  22.22.22.22
  172.78.0.1 
  5.4.3.277
  3.3.3 .3.
share|improve this question
1  
Your sample output is a bit inconsistent. Why are 32 and 5.500.5.5 both on line 3? Why is there no 3 (from 3de) between the lines for 5.5.5. and .? Why are 3.3.3 and .3. both on the last line? –  jw013 Nov 15 '12 at 19:15
2  
This looks an awful lot like this question on ServerFault -- did you not get a good answer there? –  glenn jackman Nov 15 '12 at 21:29
add comment

4 Answers

up vote 3 down vote accepted

This is a classic tr use case, so the simplest way is:

tr -cs '[:digit:].' '[\n*]' < input > output

The [:digit:]. argument specifies the characters to match (digits and dot). The [\n*] specifies the characters to replace with (replace everything with newline). The -c option inverts the first argument since we want everything except digits and dot. The -s squeezes consecutive newlines from the second string into one.

share|improve this answer
add comment

You can use sed to replace any unwanted character to a newline, and then grep to get rid of empty lines:

sed 's/[^0-9.]/\n/g' | grep . 

Note that the result is different from the one you posted: 32 5.500.5.5 is split to two lines, as well as the last line.

Perl solution: it splits each line on unwanted characters, and greps for nonempty lines.

perl -ne 'print "$_\n" for grep /./, split /[^0-9.]+/'
share|improve this answer
1  
Note that \n above in the sed command example is not standard. The standard syntax to specify a newline character in the RHS of a s command is with a backslash followed by a new line character. –  Stéphane Chazelas Nov 15 '12 at 19:39
add comment

Here's one way with GNU sed:

sed ':a;{N;s/[^\.0-9]\+/\n/g};ba' file

Here's how it works:

  1. Create a branch label;
  2. Append current/next line to register;
  3. Branch if not last line;
  4. Replace all groups that aren't matching with newlines.

Using the branch avoids spurious newlines.

share|improve this answer
add comment

grep can do it:

grep -o '[0-9.]\+'
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.