Sed - substituição de string com agrupamentos

2

Eu tenho um diretório largish com nomes de arquivos formatados como

Some_Folder-(FOL001)-clean

o que estou tentando fazer é exibir o padrão entre os colchetes no início, como

FOL001 Some_Folder-(FOL001)-clean

para que possa ser canalizado para o tipo

Até agora, o que eu tenho é

ls | sed -n -e 's/.*\(\-([A-Z]\{3,4\}[0-9]\{3,4\})-\)\(.*\)/ \t 
-(FOL001)- Some_Folder-(FOL001)-clean
/p' | sort

que produz

Some_Folder-(FOL001)-clean

No entanto, eu não quero o "- (" e ") -" na saída do primeiro padrão, apenas o conteúdo. Eu sei que posso executar isso através de sed novamente para substituir esses caracteres, mas me pergunto se é possível incluí-lo na expressão original.

    
por KG87 25.01.2014 / 04:21

3 respostas

1

Você pode mover os parênteses de agrupamento dentro dos parênteses apresentados. Isso faria:

ls | sed -nre 's/.*-\(([A-Z]{3,4}[0-9]{3,4})\)-.*/ \t -r/p'|sort

Eu também uso ( para regexp, é mais fácil escrever colchetes e parênteses.

Com essa opção, os parênteses de agrupamento são ) , \( e parênteses reais são \) , %code%

    
por 25.01.2014 / 05:42
2
ls | LC_ALL=C sed -n 's/.*-(\([A-Z]\{3,4\}[0-9]\{3,4\}\))-.*/ &/p'

Mas se for apenas para classificação, talvez você possa apenas:

ls | sort -t'(' -k2
    
por 25.01.2014 / 10:37
1

A primeira abordagem adiciona a sequência de classificação a cada nome de arquivo:

$ ls -1 | awk -F\( '{print $2 " "$1"("$2}' | sed 's/)-clean//' | sort -n
FOL001 iemeezei-(FOL001)-clean
FOL002 aghaitug-(FOL002)-clean
FOL003 ieghaeve-(FOL003)-clean

O segundo que eu gosto mais, porque o nome do arquivo permanece o mesmo. Ele adiciona um espaço à string "FOL", que pode ser usada por sort como um delimitador, o segundo sed remove o espaço novamente. Se os nomes de arquivos contiverem espaçados, você pode querer decidir por outro delimitador (que então deve ser dado a sort com -t ):

$ ls -1 | sed 's/(FOL/& /' | sort -nk2 | sed 's/FOL /FOL/'
iemeezei-(FOL001)-clean
aghaitug-(FOL002)-clean
ieghaeve-(FOL003)-clean
    
por 25.01.2014 / 05:34