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.