Grep początek linii

15

Mam plik o następującej treści:

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

Jak mogę wyodrębnić każdą linię rozpoczynającą się od nawiasu?

użytkownik3069326
źródło
4
Z jakiegoś powodu czytam „Grep początek czasu” ...
Mateen Ulhaq,

Odpowiedzi:

32

Symbolem początku linii jest ^. Tak więc, aby wydrukować wszystkie wiersze, których pierwszym znakiem jest (, chciałbyś dopasować ^(:

  1. grep

    grep '^(' file
    
  2. sed

    sed -n '/^(/p' file
    
terdon
źródło
6

Za pomocą perl

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

Wynik:

(((jfojfojeojfow 
(((jfojfojeojfow

Wyjaśnienie (część wyrażenia regularnego)

  • /^\(/

    • ^ potwierdź pozycję na początku łańcucha
    • \(dopasowuje postać (dosłownie
AB
źródło
4

Oto bashjeden liniowiec:

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

Tutaj czytamy każdą linię wejściową i jeśli linia zaczyna się od (, linia jest drukowana. Główny test jest wykonywany przez [[ $i =~ ^\( ]].

Używanie python:

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

Tutaj line.startswith('(')sprawdza, czy linia zaczyna się od (, jeśli tak, to linia jest drukowana.

heemayl
źródło
3

awk

awk '/^\(/' testfile.txt

Wynik

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

Pyton

Jako jedno-liniowy python:

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

Lub alternatywnie:

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

Wygląd BSD

lookjest jednym z klasycznych, ale mało znanych narzędzi uniksowych, które pojawiło się w AT&T Unix w wersji 7. Od man look:

Narzędzie look wyświetla w wierszu wszystkie wiersze zawierające ciąg znaków

Wynik:

$ look "(" input.txt
(((jfojfojeojfow 
(((jfojfojeojfow
Sergiy Kolodyazhnyy
źródło
2

Możesz zrobić odwrotnie.

grep -v '^[^(]' file

lub

sed '/^[^(]/d' file
Avinash Raj
źródło
Jeśli plik wejściowy zawiera puste linie, puste linie są również wyświetlane.
AB
1

W tym celu użyj polecenia grep. Zakładając, że plik o wspomnianej zawartości nazywa się t.txt:

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

Z dodatkowym argumentem „--color” możesz nawet zobaczyć w terminalu, który kolor pasuje. Ta instrukcja również nie pasuje do pustych linii.

thedler
źródło
4
Spowoduje to wydrukowanie wszystkich wierszy zawierających a (, nie tylko tych, które zaczynają się od jednego.
terdon
Jak powiedział Terdon.
Kos
1
Tak. Pominięto znak „^”, aby rozpocząć dopasowanie na początku wiersza. Przepraszam za to.
thedler
1
Teraz jest lepiej =) +1
AB