sed - encontre uma string e anexe

2

Suponha que você tenha o seguinte arquivo de texto

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.5.213 c04c0.ac
10.0.5.213 c04c1.ac 
10.0.5.213 c04c2.ac 
10.0.5.213 c04c3.ac
10.0.5.213 c04c4.ac
10.0.5.213 c04c5.ac
10.0.5.213 c04c6.ac
10.0.5.213 c04c7.ac
10.0.5.213 c04c8.ac
....

Como você poderia transformá-lo nisso?

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.5.213 c04c0.ac c04c0
10.0.5.213 c04c1.ac c04c1
10.0.5.213 c04c2.ac c04c2
10.0.5.213 c04c3.ac c04c3 
10.0.5.213 c04c4.ac c04c4
10.0.5.213 c04c5.ac c04c5
10.0.5.213 c04c6.ac c04c6
10.0.5.213 c04c7.ac c04c7
10.0.5.213 c04c8.ac c04c8
....

Eu consegui remover '.ac' dos nomes de host. No entanto, não tenho certeza porque o 'localhost' não foi desmembrado pelo regex. Como posso modificar a expressão regular para coletar somente c04cx e anexá-lo ao final da linha?

cat /etc/hosts | awk '{print $2}'| sed -r 's/(c04c)([0-9]+)(.*)//'

localhost
localhost
c04c0
c04c1
c04c2
c04c3
c04c4
c04c5
c04c6
c04c7
c04c8
    
por spuder 28.08.2013 / 01:08

3 respostas

2

Se você quiser modificar apenas as linhas com duas colunas, uma com um endereço IP e outra com um nome que termine em .ac , use um regex que corresponda a isso e somente isso. Eu recomendo que seu regex não corresponda às linhas de comentários.

sed -e 's/^\([\t ]*\)\([0-9a-fA-F.:][0-9a-fA-F.:]*\)\([\t ][\t ]*\)\([^\t ][^\t ]*\)\.ac\([\t ]*\)/.ac /'
             111111    222222222222222222222222222    33333333333    4444444444444        555555
  1. recuo
  2. endereço IP (IPv4 ou IPv6)
  3. espaço em branco separando as colunas
  4. hostname (sem .ac )
  5. espaço à esquerda
por 28.08.2013 / 01:32
1

Você pode fazer isso facilmente em awk . O problema com o seu comando é que você usa awk e sed . Você está descartando a maior parte da linha com o awk .

O exemplo abaixo apenas combina a segunda coluna com uma regex e imprime a linha inteira, com os novos dados anexados:

awk '{ if ( match($2, /(c04c[0-9]+)[.]ac/, arr) ) {
           print $0" "arr[1];
        } else {
           print;
     }' < /etc/hosts > newfile
    
por 28.08.2013 / 01:17
0
sed 's/[[:blank:]]\(c04c[0-9]\{1,\}\).*/& /'
    
por 28.08.2013 / 10:35

Tags