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 esta
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_-]*./\1/g
Acima da expressão que usei, mas obtive a saída errada.
Os grupos de captura
:help /\(
permitem armazenar o que corresponde ao padrão dentro de\(...\)
; você pode então referenciar a correspondência (via\1
para o primeiro grupo,\2
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
.tar.gz
extensão. Na substituição, coloque a captura (\1
), um espaço, depois o texto original (\0
, ou&
):Alternativamente, você pode apenas combinar as coisas antes da extensão (terminando a correspondência com
\ze
) e, em seguida, duplicar isso:Problemas com sua tentativa
\1
, mas nunca capturou nada.[a-z_-]
não corresponde a um literal.
, mas isso aparece no seu exemplo..
(como\.
); corresponderia a qualquer caractere.Se for sempre .tar.gz a ser removido, então:
nome do arquivo: test
comando
resultado
Derivando na resposta atualmente aceita , se o sufixo da string possivelmente mudar de
.tar.gz
para alguma outra.xxx.yyy
string semelhante, o seguinte aceitaria quaisquer duas stringsxxx
eyyy
:Obviamente, isso também pode ser usado
vi
como:%s/\(.*\)\(\..*\)\{2\}$/\1 &/
.Ou, usando expressões regulares estendidas com um
sed
que entende-E
:O
{2}
aqui indica a correspondência de um sufixo de exatamente duas substrings delimitadas por pontos.Isso não usa expressões regulares, mas remove o
.tar.gz
sufixo do que eu suponho que sejam nomes de arquivos e, em seguida, cola os dados originais como uma segunda coluna.As strings de sufixo são removidas invertendo as linhas e mantendo todos os campos delimitados por pontos a partir do 3º campo. Reverter isso novamente tem o efeito de cortar os dois últimos componentes de nome de arquivo delimitados por pontos.
A saída final é delimitada por tabulação, mas você pode torná-la delimitada por espaço, como na pergunta, substituindo a última
paste
etapa porpaste -d ' ' - foo.txt
.De maneira semelhante à acima, mas usando o
basename
utilitário para cortar os.tar.gz
sufixos do nome do arquivo:Tem que ser
vi
?Caso contrário, isso pode fazer o que você deseja (usando GNU
xargs
).onde
foo.txt
está seu arquivo.Atualizar.
Você não entendeu como acima?