Regex to extract multiple words from a paragraph

Viewed 50

$ echo file.txt

NAME="Ubuntu"                           <--- some of this
VERSION="20.04.4 LTS (Focal Fossa)"     <--- and some of this
ID=ubuntu
ID_LIKE=debian
VERSION_ID="20.04"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal

I want this: Ubuntu 20.04.4 LTS.

I managed with two commands:

echo "$(grep '^NAME="' ./file.txt | sed -E 's/NAME="(.*)"/\1/') $(grep '^VERSION="' ./file.txt | sed -E 's/VERSION="(.*) \(.*"/\1/')"

How could I simplify this to one command using grep/sed or perl?

2 Answers

With your shown samples try following awk code.

awk -F'"' '/^NAME="/{name=$2;next} /^VERSION="/{print name,$2}' Input_file

Explanation:

  • Setting field separator as " for all the lines here.
  • Checking condition if line starts with Name= then create variable name which has 2nd field. next will skip all further statements from there of awk program, they needed not to be executed.
  • Then checking if a line starts from VERSION= then print name and 2nd field here as per requirement.

Here is another awk solution:

awk -F '=?"' '$1 == "NAME" {s = $2; next}
$1 == "VERSION" {sub(/ \(.*/, "", $2); print s, $2}' file

Ubuntu 20.04.4 LTS
Related