Sua pergunta é bem geral; Gostaria de ter um momento para discutir o design de sed
e como ele funciona para lidar com esses casos de uso.
sed
é o editor de fluxo. Ele aceita entrada de texto em um fluxo - seja de um pipe, de um único arquivo ou de uma sequência de arquivos, um após o outro - executa ações nesse fluxo de texto e produz texto. (Note que não é intencionado ou projetado para edição de arquivos em sua concepção original, embora seja freqüentemente colocado em serviço para esse propósito.)
As notas principais da operação de sed
que você deve entender são:
-
sed
lida com texto linha por linha. O (s) comando (s) que você fornece é essencialmente um loop que opera em cada linha de entrada (por padrão) e imprime o resultado no final (por padrão).
- Um comando em
sed
consiste em um teste condicional opcional (ou "padrão") e uma ação a ser executada.
- Todas as ações são um comando de caractere único, por exemplo
p
rint, s
ubstitute, d
elete
- A condição mais comum é a regex a ser comparada com a linha, mas os números de linha também podem ser usados.
- Um intervalo pode ser especificado, significando: Faça a seguinte ação para todas as linhas de (primeira condição) até (segunda condição) .
Existe um tutorial muito completo e referência sobre sed
disponível on-line gratuito, que eu recomendo ler em cheio.
Para o seu cenário, o comando que você quer é algo como:
sed -n -e '/^Software/{s/,.*//;s/.*[[:space:]]//;p;}' filename
Que se traduz em:
-
-n
: suprima a ação padrão de sed
de imprimir cada linha de entrada
-
-e
: Execute seguindo o comando sed
-
/^Software/
: execute o seguinte conjunto de comandos contidos em {}
, apenas nas linhas que correspondem a essa expressão regular
-
s/,.*//
: remova a primeira vírgula da linha (e tudo depois dela)
-
s/.*[[:space:]]//
: remova tudo até o último caractere de espaço em branco na linha
-
p
: imprime o texto resultante.