Prithviraj
Prithviraj

Reputation: 33

Strip a part of string in linux

Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 is my string and the result I want is vm-1.0.3

What is the best way to do this

Below is what I tried

$ echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F _ {'print $2'} | awk -F - {'print $1,$2'}

vm 1.0.3

I also tried

$ echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F _ {'print $2'} | awk -F - {'print $1"-",$2'}

vm- 1.0.3

Here I do not need space in between

I tried using cut and I got the expected result

$ echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F _ {'print $2'} | cut -c 1-8

vm-1.0.3

What is the best way to do the same?

Upvotes: 0

Views: 276

Answers (4)

The fourth bird
The fourth bird

Reputation: 163642

You don't need 2 calls to awk, but your syntax with the single quotes outside the curly's, including printing the hyphen:

echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | 
  awk -F_ '{print $2}' | awk -F- '{print $1 "-" $2}'

If your string has the same format, let the field separator be either - or _

echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F"[-_]" '{print $4 "-" $5}'

Or split the second field on - and print the first 2 parts

echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | awk -F_ '{
  split($2,a,"-")
  print a[1] "-" a[2]
}'

Or with gnu-awk a bit more specific match with a capture group:

echo Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2 | 
  awk 'match($0, /^Apps-[^_]*_(vm-[0-9]+\.[0-9]+\.[0-9]+)/, a) {print a[1]}'

Output

vm-1.0.3

Upvotes: 1

Ed Morton
Ed Morton

Reputation: 204731

Making assumptions from the 1 example you provided about what the general form of your input will be so it can handle that robustly, using any sed:

$ echo 'Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2' |
    sed 's/^[^-]*-[^-]*-[^_]*_\(.*\)-[^-]*$/\1/'
vm-1.0.3

or any awk:

$ echo 'Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2' |
    awk 'sub(/^[^-]+-[^-]+-[^_]+_/,"") && sub(/-[^-]+$/,"")'
vm-1.0.3

Upvotes: 2

Denis Simuntis
Denis Simuntis

Reputation: 1

echo 'Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2' | sed -E 's/^.*_vm-([0-9]+).([0-9]+).([0-9]+)-.*/vm-\1.\2.\3/'

Upvotes: -1

Dominique
Dominique

Reputation: 17575

This is the easiest I can think of:

echo "Apps-10.00.00R000-B1111_vm-1.0.3-x86_64.qcow2" | cut -c 25-32

Obviously you need to be sure about the location of your characters. In top of that, you seem to be have two separators: '_' and '-', while both characters also are part of the name of your entry.

Upvotes: 1

Related Questions