Por que essas chaves são necessárias no sed?

6

Eu queria fazer uma pesquisa limitada em alcance no sed, então tentei

sed -n '195,210 /add/ p' <file>

Que deu

sed: -e expression #1, char 9: unknown command: '/'

Apenas como um palpite, tentei adicionar chaves:

sed -n '195,210{/add/p}' <file>

E foi bem-sucedido, mas estou tentando entender por que ele trabalhou com as chaves foram adicionadas.
Eu meio que entendo, que no bash, chaves podem delimitar uma expressão (e possivelmente aumentar sua ordem de execução), mas no caso do sed o que essas chaves estão fazendo?

Informação relevante

$ sed --version
sed (GNU sed) 4.2.2

$ bash --version
GNU bash, version 4.3.11
    
por the_velour_fog 01.06.2015 / 23:12

3 respostas

9

Pelo padrão POSIX página em sed :

The script shall consist of editing commands of the following form:

[address[,address]]function

where function represents a single-character command verb from the list in Editing Commands in sed, followed by any applicable arguments.

Portanto, o primeiro caractere não em branco após o endereço é tomado como um verbo de comando - em seu caso particular, é / , portanto, o erro: char 9: unknown command: '/' .
As chaves são referenciadas mais abaixo:

[2addr] {editing command
editing command
...
}
    Execute a list of 'sed' editing commands only when the pattern space is selected.  …

[ 2addr ] é um indicador de que o número máximo de endereços permitidos é dois.

Para esclarecer um ponto acima, a seção Endereços de sed(1) diz:

Sed commands can be given with no addresses, in which case the command will be executed for all input lines; with one address, in which case the command will be executed only for input lines which match that address; or with two addresses, in which case the command will be executed for all input lines which match the inclusive range of lines starting from the first address and continuing to the second address.  Three things to note about address ranges: the syntax is addr1,addr2 (i.e., the addresses are separated by a comma);
        … (and other stuff not relevant to this discussion)

A página de informações do gnu ( info sed ) tem um descrição semelhante de { e } , em "3.4 Comandos Freqüentemente Utilizados":

{ COMMANDS }
    A group of commands may be enclosed between { and } characters. This is particularly useful when you want a group of commands to be triggered by a single address (or address-range) match.

Caso contrário, chaves são usadas para aplicar vários comandos no mesmo endereço ou para aninhar endereços.
O padrão não é muito explícito aqui 1 mas a chave esquerda { é na verdade um comando que inicia um grupo de outros comandos sed (o grupo termina com uma chave direita } ).

E, com o risco de realmente passar TL; DR , a questão é que 195 , 210 e /add/ são todos endereços . Nenhum comando sed pode ser chamado com três endereços. Então, o caminho para fazer o seu comando funcionar é invocar o comando { no intervalo de endereços 195,210 , e, em seguida, dentro desse intervalo, invoque o comando p no endereço /add/ .

1:
no entanto, se você ler a página inteira, será mencionado que: Comanda verbos diferentes de {, a , b , < strong> c , i , r , t , w , : e # podem ser seguidos por ...

    
por 01.06.2015 / 23:52
3

De acordo com a documentação para sed , as chaves são usadas para agrupar comandos. Então

sed -n '195,210{/add/p}' <file>

Primeiro é tratado como um intervalo de endereços 195,210 com um comando de bloqueio. O comando block consiste então na especificação do endereço /add/ com o comando print p

    
por 01.06.2015 / 23:50
0

A sintaxe do sed é como

endereço / comando.

Portanto, 195,210 é o primeiro endereço que você corresponde, mas você quer executar um novo comando dentro desse intervalo, que corresponde a "adicionar" e depois imprimir. Portanto, você precisa agrupar esse comando extra usando as chaves.

    
por 01.06.2015 / 23:48

Tags