Como posso fazer meu comando sed funcionar tanto no OSX quanto no Ubuntu?

2

Eu gosto de personalizar meu prompt do PS1 e incluir o diretório atual.

Eu também tenho vários outros itens, como tempo, usuário, git branch e afins, por exemplo

Noentanto,umproblemaéquequandomeudiretórioatualtemmuitascamadas"profundas", como /home/durrantmm/Dropnot/webs/rails_apps/linker/app/views , há muito texto. (btw eu retorno de carruagem no fim dentro de minha colocação de alerta de PS1 de qualquer maneira assim meu $ real está de volta à esquerda, isso não é a questão aqui).

Então, eu tenho uma solução para isso, para usar isso na parte de localização:

LOCATION='3[01;34m\]'pwd | sed "s#\(/[^/]\+/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#_#g"''

não é bonito, mas faz o trabalho e eu então o combino com as outras coisas (não mostradas, não necessárias aqui) e recebo "os primeiros 3 níveis _ últimos dois níveis" para os diretórios, ou seja

Infelizmentenomeumacapartesednãoestáfuncionandocorretamenteeeurecebo:


[isso é realmente da minha máquina Linux, eu fingi para mostrar o que parece no meu mac, caso você esteja se perguntando).

Como posso obter o formato 3_2 para o diretório atual no meu mac?

    
por Michael Durrant 20.04.2014 / 14:57

1 resposta

3

As partes \+ e \? de seu comando sed são extensões GNU - o sed compatível com POSIX não pode usar esses aspectos da regex estendida. Em vez disso, você pode usar \{1,\} e \{0,1\} . Tente isto:

LOCATION='3[01;34m\]'pwd |
  sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#_#g"''

Para obter mais informações, consulte link e link .

Como alternativa, você pode ativar expressões regulares estendidas no OSX sed usando -E . Com isso você poderia fazer:

LOCATION='3[01;34m\]'pwd |
  sed -E "s#\(/[^/]+/[^/]+/[^/]+/\).*\(/[^/]+/[^/]+\)/?#_#g"''

No entanto, isso não funcionará no GNU sed (usa -r para isso). Usar uma solução POSIX proporcionará melhor portabilidade.

    
por 20.04.2014 / 15:17

Tags