Bem-vindo Phill Coxon ,
Método 1
Este script puro parece atender às suas necessidades
#!/usr/bin/env bash
declare id
declare name
declare url
declare version
while read line; do
if [[ ! ${line} =~ ^[\+\| ]]; then
if [[ ${line} =~ \|[[:space:]]*([[:digit:]]+)[[:space:]]*\|[[:space:]]+([[:alnum:]\.]+)[[:space:]]+\|[[:space:]]+(https?:\/\/(www\.)?[[:alnum:]]+\.[[:alpha:]]+\/?)[[:space:]]*\|[[:space:]]*([[:digit:]](\.[[:digit:]])?)[[:space:]]*\| ]]; then
id="${BASH_REMATCH[1]}"
name="${BASH_REMATCH[2]}"
url="${BASH_REMATCH[3]}"
version="${BASH_REMATCH[5]}"
echo "${id}:${name}:${url}:${version}"
fi
fi
done
Método 2
Você também pode criar uma função bash e usá-la em seu script como segue
#!/usr/bin/env bash
parse_result(){
local id
local name
local url
local version
while read line; do
if [[ ! ${line} =~ ^[\+\| ]]; then
if [[ ${line} =~ \|[[:space:]]*([[:digit:]]+)[[:space:]]*\|[[:space:]]+([[:alnum:]\.]+)[[:space:]]+\|[[:space:]]+(https?:\/\/(www\.)?[[:alnum:]]+\.[[:alpha:]]+\/?)[[:space:]]*\|[[:space:]]*([[:digit:]](\.[[:digit:]])?)[[:space:]]*\| ]]; then
id="${BASH_REMATCH[1]}"
name="${BASH_REMATCH[2]}"
url="${BASH_REMATCH[3]}"
version="${BASH_REMATCH[5]}"
echo "${id}:${name}:${url}:${version}"
fi
fi
done
}
parse_result < <(cat cmd.out)
Aqui eu uso substituição de processos , mas você pode usar o pipe
Resultado e discussão
Como exemplo, cmd.out é a saída do comando para analisar. No seu caso você tem que substituir cat cmd.out
pelo seu comando
resultado 1:
$ cat cmd.out | ./app.bash
25:example.com:http://www.example.com/:3.8
34:anotherexample.com:https://anotherexample.com/:3.2
62:yetanotherexample.com:https://yetanotherexample.com/:3.9
resultado 2:
$ bash app2.bash
25:example.com:http://www.example.com/:3.8
34:anotherexample.com:https://anotherexample.com/:3.2
62:yetanotherexample.com:https://yetanotherexample.com/:3.9