Modifique uma lista: filtre-a e reorganize os valores no resultado

3

Eu tenho um arquivo que contém as seguintes informações:

Username: [email protected]
Value one: xx:xx:xx:xx:xx:xx
Value two: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Value three: [email protected]@[xx:xx] [a mixuture of the three values]

Username: [email protected]
Value one: mm:mm:mm:mm:mm:mm
Value two: mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm
Value three: [email protected]@[xx:xx] [a mixuture of the three values]

Username: [email protected]
Value one: yy:yy:yy:yy:yy:yy
Value two: yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy
Value three: [email protected]@[xx:xx] [a mixuture of the three values]

Username: [email protected]
Value one: zz:zz:zz:zz:zz:zz
Value two: zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz
Value three: [email protected]@[xx:xx] [a mixuture of the three values]

Primeiro, quero filtrar todas as informações dos nomes de usuários que começam com S e manter as que começam com V. Depois disso, quero criar um produto final que seja um script .sh que possa ser executado. O que eu quero fazer é:

  1. Echo o nome de usuário
  2. Excluir o terceiro valor
  3. Execute o comando Hello com as opções -One, Two e --Obrigado -para -visitar no primeiro e no segundo valor.

Então, meu arquivo .sh será semelhante a este

echo Username: [email protected]
Hello -One mm:mm:mm:mm:mm:mm -Two: mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm --Thanks -for -visiting

echo Username: [email protected]
Hello One zz:zz:zz:zz:zz:zz -Two: zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz --Thanks -for -visiting

Eu assisti a uma série de vídeos no Youtube sobre Sed e li muitos dos artigos aqui tentando criar um script que resultasse no script que eu queria, mas tudo falhou. Você poderia por favor me mostrar como escrever um roteiro? Eu também adoraria se você recomendasse websites / refrences que sejam legíveis por novos usuários sobre sed (ou Awk ou Perl)

Por favor, note que o número de ":" é estático para o valor um e valor dois, isso pode ser usado de alguma forma. Eu tentei usá-lo, mas toda vez que eu tenho os dois valores, quando eu pedi apenas um valor, mas você sabe como utilizar esse fato muito melhor do que eu.

Desculpe pela longa pergunta! É preciso muito tempo demais para fazer tudo isso sem automatizar o processo e estou totalmente no mundo linux (e no computador em geral, para esse assunto!)

    
por Never.too.old.to.learn 18.12.2016 / 23:35

2 respostas

3

Você pode usar:

sed -rn '/Username: S/,/^$/d;s/Username/echo &/p;/one: /N;s/Value one: (.+)\n/Hello -One: /;s/Value two: (.+)/ -Two  --Thanks -for -visiting\n/p' file

Ou mais legível

sed -rn '{
        /Username: S/,/^$/d
        s/Username/echo &/p
        /one: /N
        s/Value one: (.+)\n/Hello -One: /
        s/Value two: (.+)/ -Two  --Thanks -for -visiting\n/p
}' file | tee newfile

Explicação

  • -r usa expressões regulares estendidas para que não seja necessário escapar de () ou +
  • -n não imprime nada até que peça (é assim que nos livraremos da terceira linha)
  • /Username: S/,/^$/d find Username: S , leia de lá até uma linha vazia e exclua tudo isso
  • s/thing/&/ find thing e substitua por si mesmo
  • /one: /N find one: e leia a próxima linha também para que possamos nos juntar a eles
  • s/Value one: (.+)\n/ match Value one: e os caracteres que vierem depois da nova linha ( \n ) que precisamos remover para unir as linhas e salvar os caracteres desconhecidos
  • backreference para o padrão salvo com ()

  • p imprima esta linha

(Eu aprendi um pouco do meu sed-fu (eu sou apenas um iniciante) aqui )

    
por Zanna 19.12.2016 / 00:06
5

Como seu arquivo é estruturado , com linhas em branco entre registros , sugiro usar awk ou perl no modo de parágrafo . Por exemplo, usando

  • uma ou mais linhas em branco como separador de registro RS=
  • espaço de cólon ou nova linha como separadores de campo -F': |\n'

e imprimindo as informações desejadas se o campo começar com V :

awk -vRS= -F': |\n' '
   ~ /^V/ {
    print "echo "  ": " ; 
    print "Hello -One " , "-Two "  " --Thanks -for -visiting"; 
    print "";
  }' file

dando

echo Username: [email protected]
Hello -One mm:mm:mm:mm:mm:mm -Two mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm --Thanks -for -visiting

echo Username: [email protected]
Hello -One zz:zz:zz:zz:zz:zz -Two zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz --Thanks -for -visiting
    
por steeldriver 19.12.2016 / 00:29