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?
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?
Odpowiedzi:
Oto bash
jeden 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.
awk '/^\(/' testfile.txt
Wynik
$ awk '/^\(/' testfile.txt
(((jfojfojeojfow
(((jfojfojeojfow
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
look
jest 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
Możesz zrobić odwrotnie.
grep -v '^[^(]' file
lub
sed '/^[^(]/d' file
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.
(
, nie tylko tych, które zaczynają się od jednego.