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]
significaa
oub
ouc
,[^abc]
significa qualquer coisa excetoa
,b
ouc
. Portanto,[^:]*
corresponderá a 0 ou mais não-:
. -
[eE]xception
: corresponde aexception
ouException
. -
:.*
: 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.