Extrai a linha que começa com um padrão específico em sed

3

Meu arquivo de entrada é assim:

IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

Estou usando o sed para extrair todo o IDno e o tipo apenas quando o tipo é aluno.

sed -e '/IDno=/b' -e '/Type=Student/b' d

Isso me pega todas as linhas com o tipo estudante, mas não com o IDnos.

Eu quero pegar

IDno="1"
Type=Student
IDno="2"

mas estou recebendo

Type=Student

O que estou fazendo de errado?

    
por user110327 27.02.2017 / 06:44

4 respostas

4

egrep pode obter várias linhas de um arquivo. Usando um pipe | como um separador, você pode escolher quantos critérios diferentes quiser. egrep é o equivalente de grep -E . egrep é um script encontrado na pasta /bin com o conteúdo apontando para exec grep -E "$@" .

Exemplo:

egrep "IDno=|Type=Student" inputfile

ou

grep -E "IDno=|Type=Student" inputfile

A saída deve:

IDno="1"
Type=Student
IDno="2"

Espero que isso ajude!

    
por Terrance 27.02.2017 / 07:00
4

Com sed , para imprimir linhas específicas, é mais fácil usar a opção -n e o comando p :

sed -rn '/IDno=|Type=Student/p'

Ou:

sed -n -e '/IDno=/p' -e '/Type=Student/p'

A opção -n suprime a saída, a menos que seja explicitamente impressa. O comando p , é claro, imprime linhas de correspondência.

    
por muru 27.02.2017 / 06:57
3
  • awk :

    Definir o separador de campo como = e imprimir os registros que contêm Type=Student como o registro inteiro ou IDno como o primeiro campo:

    awk -F= '$1=="IDno" || $0=="Type=Student"'
    
  • perl :

    Imprime as linhas que começam com IDno seguidas por = ou começam com Type , seguidas por = e terminam em Student :

    perl -ne 'print if /^(IDno=|Type=Student$)/'
    

Exemplo:

% cat file.txt                                  
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

% awk -F= '$1=="IDno" || $0=="Type=Student"' file.txt
IDno="1"
Type=Student
IDno="2"

% perl -ne 'print if /^(IDno=|Type=Student$)/' file.txt
IDno="1"
Type=Student
IDno="2"
    
por heemayl 27.02.2017 / 12:55
0

A pergunta original parece pedir "para extrair todo o IDno e o tipo somente quando o tipo for student. " Mas o resultado do exemplo retorna todos os IDno = lines, então isso é bastante contraditório ...

Aqui está uma resposta que só retorna os IDno's e Type's quando o Type = Student.

sed -n 'N;N;/IDno=.*Type=Student/p' filename | grep -v "^Name="

Uma pequena explicação:

  • -n, --quiet, --silent suprime a impressão automática de espaço padrão
  • N;N; Lê / acrescenta a próxima linha de entrada no espaço padrão. (duas vezes)
  • /IDno=.*Type=Student/p localizar & imprimir de IDno = para Type = Student
  • | grep -v "^Name=" não mostra o nome = linha

Eu não gosto do sed | grep, mas não tenho certeza de como obter o sed para re-pesquisar sua saída, e um pipe geralmente diz "pegue essa saída e faça algo" ... Poderia fazer grep | sed também

grep -v "^Name=" t | sed -n 'N;N;/IDno=.*Type=Student/p'
    
por Xen2050 27.02.2017 / 15:22