Início da linha Grep

15

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?

user3069326
fonte
4
Por alguma razão, eu li "Grep início dos tempos" ...
Mateen Ulhaq

Respostas:

32

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

  1. grep

    grep '^(' file
    
  2. sed

    sed -n '/^(/p' file
    
Terdon
fonte
6

Usando perl

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

Resultado:

(((jfojfojeojfow 
(((jfojfojeojfow

Explicação (parte da regex)

  • /^\(/

    • ^ afirmar posição no início da string
    • \(corresponde ao personagem (literalmente
AB
fonte
4

Aqui está bashum liner:

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

Aqui estamos lendo cada linha de entrada e, se a linha começar (, a linha será 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 sim, então a linha é impressa.

heemail
fonte
3

awk

awk '/^\(/' testfile.txt

Resultado

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

Pitão

Como python one-liner:

$ 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 Unix clássicos, mas pouco conhecidos, que apareceu na AT&T Unix versão 7. De man look:

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

O resultado:

$ look "(" input.txt
(((jfojfojeojfow 
(((jfojfojeojfow
Sergiy Kolodyazhnyy
fonte
2

Você pode fazer o inverso.

grep -v '^[^(]' file

ou

sed '/^[^(]/d' file
Avinash Raj
fonte
Se o arquivo de entrada contiver linhas vazias, as linhas em branco também serão exibidas.
AB
1

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

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

Com '--color' 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.

thedler
fonte
4
Isso imprimirá todas as linhas que contêm a (, não apenas aquelas que começam com uma.
terdon
Como disse Terdon.
kos
1
Sim. Falhou o caractere '^' para iniciar a partida no início da linha. Desculpe por isso.
Thedler
1
Agora é melhor =) +1
AB