Sou novo no sed, tenho uma string
lightdm --session-child 14 21
os dois números podem mudar e eu removeria tudo depois do lightdm
Eu tentei de várias maneiras, mas nenhuma funcionou
sed 's/ --session-child*//'
sed 's/\ --session-child*//'
sed 's/ --session-child*$//'
e outros, mas nenhum funcionou. Onde está o erro?
*
em expressões regulares significa "repete o caractere anterior (ou classe de caractere) arbitrariamente muitas vezes. Então,--session-child*
corresponde--session-chil
--session-child
--session-childd
--session-childdd
--session-childddd
No entanto, não corresponde a
não é um
--session-child 1
, porque ad
! (e nem a1
, mas isso não importa mais naquele momento. A sequência ded
é quebrada.)Se você quer dizer "qualquer caractere único", isso é a
.
em expressões regulares. Se você quer dizer "arbitrariamente muitos caracteres arbitrários", isso é.*
.Então, você precisaria
sed 's/ --session-child.*//'
No entanto, eu tendo a defender a correspondência das coisas que você quer em vez de apagar as coisas que você não quer . Não sei o que você pretendia originalmente, mas assumindo que você queria preservar qualquer coisa antes do primeiro espaço , eu escreveria isso como
. Repita isso quantas vezes (0 ou mais) se possível (o primeiro
sed 's/^\([^ ]*\) .*$/\1/'
. Significado: do início da linha (^
), inicie um novo grupo (encapsulado em\(
…\)
). Esse grupo contém qualquer caractere que esteja na classe de caracteres (incluído em[
…]
) descrita por^
, que significa "tudo menos" (^
) o caractere de espaço*
).Se um espaço vier depois disso, absorva esse espaço e todos os caracteres até o final da linha (
$
) e substitua-os pelo primeiro (e único) grupo correspondente,\1
.Isso dá muito mais trabalho para escrever. Por que eu faria isso? Porque escrever o que você não quer é frequentemente um exercício mental que envolve suposições que não são inerentes ao problema real. Por exemplo, aqui você assume que o primeiro argumento para qualquer coisa que vem antes é
--session-child
. Agora, se esse "qualquer coisa" não élightdm
, por que ele precisaria de um--session-child
argumento? E se sempre foilightdm
why, você usariased
? Você apenas produzirialightdm
. Então, ao não fazer suposições sobre um "fato secundário bonitinho", mas focar no que realmente me importa, posso evitar bugs futuros com entradas que não esperava.