demand removendo tudo até e incluindo o primeiro período se houver mais de um ponto nessa linha e faça isso para o arquivo inteiro

4

sed removendo tudo até e incluindo o primeiro período, se houver mais de um período nessa linha e faça isso para o arquivo inteiro.

Antes de sed:

akamai.com
cdnjs.cloudflare.com
com.cdn.cloudflare.net

Após sed:

akamai.com
cloudflare.com
cdn.cloudflare.net
    
por Bjorn 27.07.2018 / 19:09

2 respostas

12
$ sed '/\..*\./s/^[^.]*\.//' file
akamai.com
cloudflare.com
cdn.cloudflare.net

O script sed corresponde primeiro às linhas que contêm pelo menos dois pontos usando a expressão regular \..*\. (também pode ter sido escrito [.].*[.] ). Para as linhas correspondentes, uma substituição que remove tudo até e incluindo o primeiro ponto é executada.

Usando awk , sendo um pouco longo em comparação com o acima:

$ awk -F '.' -vOFS='.' 'NF > 2 { n=split($0, a); $0=""; for (i=2;i<=n;++i) $(NF+1)=a[i] } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net

Aqui, sempre que houver mais de dois campos delimitados por ponto, dividimos a linha atual em pontos e recriamos o registro atual, pulando o primeiro campo. O 1 no final faz com que todas as linhas (modificadas ou não) sejam impressas.

Shorter awk da mesma maneira que a sed solution:

$ awk -F '.' 'NF > 2 { sub("^[^.]*\.", "") } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net
    
por 27.07.2018 / 19:17
1

Você pode abordar isso usando os seguintes métodos:

perl -lpe '$_ = $1 if /\.(.*\..*)/' input-file.txt

em que, confiamos em um regex que faz o ponto zero em um caractere . de ponto que pode ver outro ponto à direita. Então o que estiver à direita é capturado e disponibilizado em $1 e colocado dentro da linha atual. A opção -p para Perl , em seguida, leva isso para o stdout , bem como para o que não correspondeu também.

perl -F\. -pale '$_ = join ".", splice @F, 1 if @F > 2' input.txt
  • O arquivo de entrada é lido linha por linha através da opção -p e o autoprint também é ativado por meio dessa opção.

  • Cada registro é dividido no ponto . e os campos individuais armazenados na matriz @F indexados a partir de 0 por meio da opção -a .

  • -l opção faz RS = ORS = "\n"

  • Somente quando tivermos mais de dois elementos na matriz @F , ou seja, houver pelo menos dois pontos no registro atual, selecionamos esse registro para modificações.

  • Para tal registro, a função splice @F, 1 retira os elementos do 2º e os apresenta para a função join , que então os une usando o caractere de ponto, então é recheado dentro do $_ , também conhecido como , registro atual.

  • A opção -p , então, leva esse registro atual modificado para a stdout. Aquele que não modificou é de qualquer maneira levado silenciosamente ao stdout.

Usando GNU sed , também podemos fazer a tarefa sem recorrer à captura de parentes:

sed -e 
    s/\./\n/2;T
    y/\n./.\n/
    s/\n/./2g
    s/.*\n//
' input.file

Saída:

akamai.com
cloudflare.com
cdn.cloudflare.net
    
por 28.07.2018 / 21:30

Tags