substituições no editor vi

0

Eu tenho um arquivo chamado foo.txt . Este arquivo contém valores:

abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz

Eu gostaria de obter uma saída como essa

abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

O mesmo valor / texto deve aparecer antes do valor / texto original. Como conseguir isso usando expressões regulares?

%s/^[a-z_-]*.//g

Acima da expressão que usei, mas obtive resultados errados.

    
por shas 20.09.2018 / 13:18

4 respostas

5

Grupos de captura :help /\( permitem que você armazene o que é correspondido pelo padrão dentro %código%; você pode referenciar a correspondência (via \(...\) para o primeiro grupo, , e assim por diante) na substituição (ou mesmo depois no próprio padrão).

Uma abordagem (há muitas) para o seu problema é capturar o nome do arquivo antes da extensão . Na substituição, coloque a captura ( .tar.gz ), um espaço e, em seguida, o texto original ( ou & ):

:%substitute/\(.*\)\.tar\.gz$/ &/

Como alternativa, você pode apenas combinar as coisas antes da extensão (terminar a correspondência com \ze ) e depois duplicar isso:

:%substitute/.*\ze\.tar\.gz$/& &/

Problemas com sua tentativa

  • Você usou a referência de referência , mas nunca capturou nada.
  • O [a-z_-] não corresponde a um literal . , mas isso aparece no seu exemplo.
  • Não há escape do% final% co_de (como . ); corresponderia a qualquer personagem.
  • Nenhuma duplicação na peça de substituição; você efetivamente removeu o texto em vez de adicionar.
por 20.09.2018 / 13:52
0

Se é sempre .tar.gz a ser removido, então:

%s/^\(.*\).tar.gz/ .tar.gz/g
    
por 20.09.2018 / 13:54
0

nome do arquivo: testt

abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz

comando

sed "s/[a-z]\{3\}\.\{0,1\}-\{0,2\}\.\{0,1\}[0-9]\{0,1\}\.\{0,1\}[0-9]\{0,1\}/& &/" test| sed "/[a-z]\{3\}\. /s/\.//1"

saída

abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
    
por 21.09.2018 / 17:17
-2

Tem que ser vi?

Se não, isso pode fazer o que você quer.

cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {} .tar.gz

onde foo.txt é o seu arquivo.

Atualizar.

$ cat foo.txt
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz


$ cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {}.tar.gz
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

Você não entendeu como acima?

    
por 20.09.2018 / 13:29