É um comportamento normal de sed
. De POSIX sed documentação:
Addresses in sed
An address is either a decimal number that counts input lines
cumulatively across files, a '$' character that addresses the last
line of input, or a context address (which consists of a BRE, as
described in Regular Expressions in sed , preceded and followed by a
delimiter, usually a slash).
An editing command with no addresses shall select every pattern space.
An editing command with one address shall select each pattern space
that matches the address.
An editing command with two addresses shall select the inclusive range
from the first pattern space that matches the first address through
the next pattern space that matches the second. (If the second address
is a number less than or equal to the line number first selected, only
one line shall be selected.) Starting at the first line following the
selected range, sed shall look again for the first address.
Thereafter, the process shall be repeated. Omitting either or both of
the address components in the following form produces undefined
results:
[address[,address]]
Você pode ver que sed
imprimirá o intervalo inclusivo do primeiro endereço até o próximo endereço correspondente.
No seu caso, 1,/1/p
, sed
imprime a primeira linha porque corresponde ao endereço 1
. Em seguida, a partir da segunda linha, sed procurará o segundo endereço que corresponde ao padrão /1/
. E pare de imprimir, se encontrado. Como na segunda linha, você não tem nenhum padrão que corresponda a /1/
, por isso sed
imprime o restante.
No caso de 1./2/p
, sed imprime a primeira linha como acima, depois o segundo padrão de correspondência de linha /2/
, sed
imprime e repete a ação para o resto. Mas você não pode combinar o endereço 1
para o resto, então sed
não imprime nada.
Um exemplo:
$ echo 1 2 3 1 4 1 | tr ' ' $'\n' | sed -rn '1,/1/p'
1
2
3
1
Como você usa GNU sed
, é possível usar o formulário 0,addr2
:
0,addr2
Start out in "matched first address" state, until addr2 is
found. This is similar to 1,addr2, except that if addr2 matches
the very first line of input the 0,addr2 form will be at the end
of its range, whereas the 1,addr2 form will still be at the
beginning of its range. This works only when addr2 is a regular
expression.
Então, seu comando se torna:
seq 1 4 | tr ' ' $'\n' | sed -rn '0,/'"$1"'/p'
Então:
$ ./1.sh 1
1