Há algumas coisas estranhas aqui. Primeiro, como acabei de aprender tentando responder sua pergunta (obrigado!), sed tem um truque legal:
/foo/s//bar/
Isto significa "se esta linha corresponde a foo , então substitua o que foi correspondido por foo com bar . Eu realmente não entendo o ponto disso, para ser honesto, você poderia fazer a mesma coisa com um simples s/foo/bar/ , mas lá vai você.
Quanto ao regex:
-
^: corresponde ao começo da linha. -
[^:]*: quando o^está dentro de colchetes, isso é um conjunto de caracteres negativos. Então, enquanto[abc]significaaoubouc,[^abc]significa qualquer coisa excetoa,bouc. Portanto,[^:]*corresponderá a 0 ou mais não-:. -
[eE]xception: corresponde aexceptionouException. -
:.*: corresponde a:e depois todo o restante até o final da linha. - Finalmente, a primeira parte está em parênteses com escape (
\( \)), o que significa que o que foi correspondido é capturado e pode ser consultado posteriormente como.
O próximo bit é o operador de substituição, aqui s///p . Isso significa substituir o que foi correspondido antes (incluindo a parte não capturada, portanto, toda a linha) com o que foi capturado ( ). O resultado é que somente o que estava na linha até e incluindo a palavra expression (ou Expression ) será impresso. E, como o -n suprime a saída, o p no final significa "imprima esta linha se a substituição foi bem-sucedida.
Por fim, o uniq -c fornecerá o número de linhas que correspondem ao padrão encontrado no seu arquivo. Observe que não é o número de vezes que a palavra exception ocorre no arquivo. Se você tiver mais de um exception: na mesma linha, isso será contado como um.