sed 's![^/]*$!!'
Isso faz o seguinte:
- Use um delimitador diferente de
/, porque a expressão regular contém/. (Eu gosto de!e|porque eles se parecem com linhas divisórias; outras pessoas usam@,#,^ou o que quiserem. É possível usar/em uma expressão regular delimitada por/, mas isso pode ser difícil para uma pessoa ler.) - Encontre uma sequência de caracteres (zero ou mais) diferente de
/. (Faça o maior tempo possível.) Mas deve ser no final da linha. - E substitua-o por nada.
Advertência: uma linha de entrada que não contém caracteres /
será totalmente eliminado
(ou seja, todo o conteúdo da linha será apagado,
deixando apenas uma linha em branco).
Se quiséssemos consertar isso,
e deixe uma linha sem barras passar inalterada,
poderíamos mudar o comando para
sed 's!/[^/]*$!/!'
Isso é o mesmo que a primeira resposta,
exceto que ele corresponda ao último / e todos os caracteres depois dele,
e, em seguida, substitui-os por um /
(na verdade, deixando o% final/ na linha de entrada sozinho).
Então, onde a primeira resposta encontra one.txt e a substitui por nada,
isso encontra /one.txt e o substitui por / .
Mas, em uma linha que não contém caracteres / ,
a primeira resposta corresponde à linha inteira e a substitui por nada,
enquanto este não encontraria um fósforo,
e assim não faria uma substituição.
Poderíamos usar / como o delimitador neste comando,
mas então teria que ser
sed 's/\/[^/]*$/\//'
"escapando" das barras que fazem parte da expressão regular
e a string de substituição
precedendo-os com barras back ( \ ).
Algumas pessoas acham essa selva de “árvores inclinadas”
ser mais difícil de ler e manter,
mas basicamente se resume a uma questão de estilo.