sed espaço padrão e mantenha espaço

5

eu estava indo apenas por isso e eu não conseguia entender.

sed -n '1h; 1!H; ${ g; s/foo\nbar/bla\nblub/ p }' file.

onde o arquivo cat é:

 foo
 foo
 bar

porque há 1!H porque para mim 1h sobrescreve o espaço padrão e 1!H não tem utilidade

Mas o sed um forro parece funcionar bem.

    
por munish 03.05.2013 / 12:44

2 respostas

8

Veja a resposta do @ manatwork pelo motivo real de 1h;1!H , mas eu queria adicionar uma nota de portabilidade .

A sintaxe padrão e portátil deve ser:

sed -n '1h; 1!H; ${ g; s/foo\nbar/bla\
blub/p;}'

Caso contrário, não funcionará na maioria das sed implementações, por exemplo, as tradicionais Unix.

Isso é \n é entendido no lado esquerdo do comando s , mas você precisa usar um caractere de barra invertida seguido por um caractere de nova linha real no lado direito. Você também precisa do ; entre o comando s e } e nenhum espaço antes do p .

Você também pode armazenar o conteúdo do arquivo no espaço padrão, em vez do espaço de armazenamento:

sed -n '
  :1
  $!{
   N;b1
  }
  s/foo\nbar/blah\
blup/p'

Mas com padrão e espaço de espera, com a maioria das implementações sed que só funcionam com arquivos pequenos, já que a maioria das implementações não-GNU tem um tamanho limitado para esses (e POSIX apenas requer que eles consigam conter 8kB de dados ).

Portavelmente, seria melhor usar perl :

perl -0777 -ne 'print if s/foo\nbar/blah\nblup/'

Como o tamanho não é limitado em perl ou GNU sed , no entanto, tenha cuidado com o desempenho do sistema, pois ele pode acabar usando toda a memória do sistema se você não tiver definido administrativamente limites no uso de memória por processo.

    
por 03.05.2013 / 14:22
8

why there is 1!H because to me 1h overwrites the pattern space and 1!H is of no use

Nenhuma sobreposição ocorre porque eles não são executados na mesma linha de entrada:

1h   # when input line number is 1, copy pattern space to hold space
1!H  # when input line number is not 1, append pattern space to hold space

Isso é necessário porque, de acordo com info sed :

'H'
     Append a newline to the contents of the hold space, and then
     append the contents of the pattern space to that of the hold space.

Portanto, se você usar apenas H para anexar todas as linhas, haverá uma nova linha extra antes da primeira linha:

bash-4.2$ seq 3 | sed -n 'H; ${g; p;}'

1
2
3
bash-4.2$ seq 3 | sed -n '1h; 1!H; ${g; p;}'
1
2
3
    
por 03.05.2013 / 13:05

Tags