Usando sed obter substring entre duas aspas duplas

12

Eu tenho um arquivo

xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
"/home/path/to/file1": Permission denied (13) rsync:
"/home/path/to/file2": Permission denied (13) rsync:
"/home/path/to/file3": Permission denied (13)

Agora quero extrair somente os caminhos de arquivo e armazená-los em outro arquivo. O arquivo de saída é como:

/home/path/to/file 
/home/path/to/file1 
/home/path/to/file2
/home/path/to/file3

Usando sed ou awk como posso fazer isso?

Eu tentei sed -n '/"/,/"/p' myfile , mas não está funcionando.

    
por XemX 03.12.2012 / 14:48

4 respostas

16

Você pode canalizar o stderr do seu comando rsync para um script awk:

awk -F '"' '{print $2}' 

Ou para um comando de recorte como este:

cut -d'"' -f2
    
por 03.12.2012 / 14:55
6

Usando sed :

sed 's/^[^"]*"\([^"]*\)".*//'

Isso procura: início de linha, uma série de não-cotações, uma aspa dupla, captura uma série de não-cotações, uma aspa dupla e qualquer outra coisa na linha, e substitui pelo material capturado.

$ sed 's/^[^"]*"\([^"]*\)".*//' <<'EOF'
> xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
> "/home/path/to/file1": Permission denied (13) rsync:
> "/home/path/to/file2": Permission denied (13) rsync:
> "/home/path/to/file3": Permission denied (13)
> EOF
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
$

Teste no RHEL 5 Linux com GNU sed , mas apenas usando recursos que teriam funcionado na versão de sed do 7th Edition para UNIX ™.

Por acaso, uma maneira um pouco mais simples de fazer isso é com dois comandos substitutos; mudar tudo até e incluindo as primeiras aspas duplas para uma string vazia (que é uma sequência de zero ou mais não-citações seguidas de aspas duplas); mudar tudo depois do que é agora a primeira citação dupla para nada:

sed 's/^[^"]*"//; s/".*//'

Aliás, o comando que você tentou ('sed -n' / "/, /" / p ') imprime de uma linha contendo aspas duplas para a próxima linha contendo aspas duplas, sem editar as linhas. Por isso, parece que não funcionou para você - ele fez o que você pediu, mas o que você pediu para fazer não foi o que você pretendia fazer.

Eficiência-sábia, é improvável que haja uma diferença mensurável no desempenho. Em termos de facilidade de manutenção, suspeito que o último seja menos desgastante para as células cerebrais.

    
por 03.12.2012 / 18:00
0

Se a sua versão de grep for compatível com Perl-regexp:

grep -oP '(?<=")/home/.*?(?=")' file >> anotherfile

Resultados:

/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3

Você também pode tornar isso menos estrito, para corresponder a qualquer coisa entre as duplas, se desejar:

grep -oP '(?<=")[^"]*' file >> anotherfile
    
por 03.12.2012 / 22:37
-1

Use o > > operador para salvar qualquer saída em um arquivo.

Como

grep -r "pattern" * >> file.txt

Então, basta alterar isso para seu cenário específico usando sed acrescentando

>> filename

para o comando

    
por 03.12.2012 / 14:52

Tags