O comando sed no exemplo 6 extrai apenas o número de linhas da saída wc -l .
Ele está executando wc -l on $f (o arquivo que pertence à execução do script que foi passado como um argumento). Isso normalmente produziria uma saída assim:
$ wc -l .bashrc
17 .bashrc
Número de linhas na coluna 1 e nome do arquivo na coluna 2. O comando sed está capturando apenas o número de linhas de uma maneira bastante desnecessária.
$ wc -l .bashrc | sed 's/^\([0-9]*\).*$//'
17
A sed declaração 's/^\([0-9]*\).*$//' faz o seguinte:
-
^- corresponde ao início da linha -
\([0-9]*\)- Corresponde a números ilimitados (Os parênteses com escape formam um grupo de captura) -
.*- Corresponde a qualquer coisa vezes ilimitadas -
$- corresponde ao final da linha -
- Representa o conteúdo do primeiro grupo de captura.
Essencialmente, isso corresponde a qualquer linha que comece com um número e substitua toda a linha pelo primeiro grupo de captura (o número).
Obrigado Stephen Kitt por recomendar isso:
$ wc -l < .bashrc
17
Caso contrário, usar cut ou awk seria melhor para algo assim:
$ wc -l .bashrc | cut -d' ' -f1
17
$ wc -l .bashrc | awk '{print $1}'
17