torr ou awk para substituir a string entre os padrões (converter caminho absoluto para relativo)

0

Estou tentando substituir todas as pastas em um caminho por ".." Isso faz parte de um script maior que eventualmente substituirá alguns caminhos absolutos em caminhos relativos.

O resultado esperado deve ser assim:

/ABCDdasda234sEA/asdas2das/asdasf34234/ => /../../../
/ABCDdasda234sEA/asdas2das/asdasf34234/124551assdfa/ => /../../../../

Eu tentei vários regex mas não consegui corresponder corretamente, porque o último "/" é considerado o final da string em vez de corresponder várias vezes:

[root@test]# sed "s/^\/.*\/$/\/..\//g" <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/"

/../
    
por Futur'Fusionneur 26.09.2017 / 16:11

4 respostas

2

1) O .* vai comer tudo, incluindo as seguintes barras, então use [^/]* (qualquer número de caracteres, exceto a barra)

2) Para evitar o \+ (para "uma ou mais ocorrências") que não está disponível em todos os sed version simplesmente adicione um ponto que requer pelo menos um caractere. Você não precisa de outro [^/] aqui se confiar que não há //

3) Apenas para embelezamento: se o padrão ou substituição contiver uma barra, será mais fácil de ler se você usar um delimitador diferente para o comando s , como _ ou #

Todos juntos:

sed 's_/.[^/]*_/.._g'
    
por 26.09.2017 / 17:21
2
awk -F/ -v OFS=/ '{for (i=1; i<=NF; i++) if (length($i)) $i = ".."}1' <<END
/ABCDdasda234sEA/asdas2das/asdasf34234/
/ABCDdasda234sEA/asdas2das/asdasf34234/124551assdfa/
END
/../../../
/../../../../
    
por 26.09.2017 / 16:18
2

Eu encontrei mais dois métodos enquanto isso:

sed 's:/[[:alnum:]]*:../:g' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/42346346346/" | sed 's:^..::g'


awk -F'/' '{for( i = 2; i <= NF-1; i++ ) printf "/../" }' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/asfasddfg/2345555/"  | sed 's/\/\//\//g'

Inclua também outros caracteres especiais, como "_":

sed 's:/[[:alnum:]_]*:../:g' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/42346346$346/" | sed 's:^..::g'
    
por 26.09.2017 / 16:31
0

Algumas versões do sed não aceitam os recursos avançados de expressões regulares (por exemplo, + ou {} ) por padrão. No meu sistema, \ + funciona bem.

Além disso, você pode substituir \ w aqui com [^ /] , pois os nomes dos arquivos podem conter espaços em branco.

    
por 26.09.2017 / 16:39