Grep início da linha

10

Eu tenho um arquivo com o seguinte conteúdo:

(((jfojfojeojfow 
//
hellow_rld
(((jfojfojeojfow
//
hellow_rld

Como posso extrair todas as linhas que começam com parênteses?

    
por user3069326 21.06.2015 / 14:52

6 respostas

26

O símbolo para o início de uma linha é ^ . Assim, para imprimir todas as linhas cujo primeiro caractere é um ( , você deseja corresponder a ^( :

  1. grep

    grep '^(' file
    
  2. sed

    sed -n '/^(/p' file
    
por terdon 21.06.2015 / 15:03
6

Usando perl

perl -ne '/^\(/ && print' foo

Saída:

(((jfojfojeojfow 
(((jfojfojeojfow

Explicação (parte regex)

  • /^\(/

    • ^ afirma a posição no início da string
    • \( corresponde ao caractere ( literalmente
por A.B. 21.06.2015 / 15:12
4

Aqui está um marcador bash one:

while IFS= read -r line; do [[ $line =~ ^\( ]] && echo "$line"; done <file.txt

Aqui estamos lendo cada linha de entrada e se a linha começa com ( , a linha é impressa. O teste principal é feito por [[ $i =~ ^\( ]] .

Usando python :

#!/usr/bin/env python2
with open('file.txt') as f:
    for line in f:
        if line.startswith('('):
            print line.rstrip()

Aqui line.startswith('(') verifica se a linha começa com ( , se for o caso, a linha é impressa.

    
por heemayl 21.06.2015 / 22:38
3

awk

awk '/^\(/' testfile.txt

Resultado

$ awk '/^\(/' testfile.txt                   
(((jfojfojeojfow 
(((jfojfojeojfow

Python

Como o one-liner do python:

$ python -c 'import sys;print "\n".join([x.strip() for x in sys.stdin.readlines() if x.startswith("(")])' < input.txt    
(((jfojfojeojfow
(((jfojfojeojfow

Ou alternativamente:

$ python -c 'import sys,re;[sys.stdout.write(x) for x in open(sys.argv[1]) if re.search("^\(",x)]' input.txt

aparência BSD

look é um dos utilitários clássicos Unix, mas pouco conhecidos, que surgiram no AT & amp; T Unix versão 7. De man look :

  

O utilitário look exibe todas as linhas no arquivo que contêm string como um prefixo

O resultado:

$ look "(" input.txt
(((jfojfojeojfow 
(((jfojfojeojfow
    
por Sergiy Kolodyazhnyy 21.06.2015 / 15:05
2

Você pode fazer o inverso.

grep -v '^[^(]' file

ou

sed '/^[^(]/d' file
    
por Avinash Raj 22.06.2015 / 10:41
1

Use o comando grep para isso. Supondo que o arquivo com o conteúdo mencionado é chamado t.txt:

user:~$ grep '^(' t.txt
(((jfojfojeojfow
(((jfojfojeojfow

Com '- cor' como argumento adicional, você pode até ver em cores no terminal o que corresponde. Esta instrução também não corresponde a linhas vazias.

    
por thedler 21.06.2015 / 15:02