Regex, exclua todos os caracteres após a última ocorrência de “/”

1

Eu tenho uma lista de nomes de caminho como este em um arquivo:

/path/to/directory/one.txt
/longer/path/to/some/directory/two.py
/path/with spaces/in/it/three.sh

Eu quero excluir todos os caracteres após a última ocorrência de "/" então a saída desejada para o acima é:

/path/to/directory/
/longer/path/to/some/directory/
/path/with spaces/in/it/
    
por user321546 18.11.2018 / 07:31

2 respostas

0
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.

    
por 18.11.2018 / 07:43
0

Você pode usar o utilitário dirname :

xargs -I {} dirname {} <file.txt

Isso lhe daria os nomes de caminho de cada diretório pai na lista. Para a lista dada, produziria

/path/to/directory
/longer/path/to/some/directory
/path/with spaces/in/it

Para incorporar uma nova linha em um caminho, use

/some/path with a \
newline/in/it

E para inserir cotações, escape-as como, por exemplo, \" .

    
por 18.11.2018 / 19:12