Remove o último / da string de caminho usando sed

5

Estou tentando usar o sed para substituir apenas o último / na seguinte estrutura de diretório, mas não consigo fazer isso. Alguma sugestão?

A entrada é /tmp/ABC/Dirs/ , a saída deve ser /tmp/ABC/Dirs

echo " /tmp/ABC/Dirs/"  | sed -r "s/\/(?:[a-zA-Z0-9])/g"
    
por KK2486 06.01.2018 / 08:34

4 respostas

1

Fui eu quem respondeu a pergunta primeiro com o meu comentário s/\/$// .

Outras pessoas tiveram tempo de contribuir com respostas muito mais completas naquele dia.

Então, hoje - alguns dias depois - eu postei uma resposta redundante, porque eu quero que o prêmio "Peer Pressure" Bronze seja retirado da lista.

sed -e s./$..g   # You can golf the quotes and the "\" here

Então, por favor, gente boa, por favor avalie esse tempo até -3:)

    
por 12.01.2018 / 18:52
9

sed parece ser um pouco exagerado aqui, você pode remover um / diretamente no shell Korn (e shells similares como bash , e todos os shells compatíveis com POSIX, já que o recurso shell Korn foi especificado por POSIX para o utilitário sh ):

$ foo=/tmp/ABC/Dirs/
$ echo "${foo%/}"
/tmp/ABC/Dirs
    
por 06.01.2018 / 10:59
3

Se quisesse fazer com sed , você faria:

file=/any/path
sed '$s|/$||' << EOF
$file
EOF

Ou seja, remova um caractere / no final (segundo $ ) da última linha (primeiro $ ) do caminho armazenado em $file . Com algumas implementações de sed que assumem o tamanho em bytes da maior sequência de caracteres não pertencentes à nova linha em $file , não excede LINE_MAX (que geralmente é menor que o tamanho máximo de um caminho suportado em argumentos para chamadas do sistema ).

Observe que, para o caso especial de / ou // , a remoção desse / pode não ser desejável. Você também pode querer remover todos os / em /foo/bar/// , por exemplo.

Então talvez um mais avançado e que justifique sed um pouco mais seria:

sed '
  ${
    s|\([^/]\)/*$||
    s|^////*|/|
    1b
    s|/*$||
  }' << EOF
$file
EOF

Isso é preservar // como é, transformar /// , ///// e / em / , mas foo// em foo e $'foo\n//' em $'foo\n' .

Observe que (?:...) é um operador perl regexp, não um operador regexp estendido (conforme reconhecido pelo GNU sed com essa opção -r específica do GNU).

    
por 06.01.2018 / 14:18
1

Você pode usar perl ao invés de sed:

echo "/tmp/ABC/Dirs/" | perl -pne  "s/\/$//g"

Saída

/tmp/ABC/Dirs
    
por 06.01.2018 / 09:24

Tags