Chcę wyszukać określony ciąg w wielu wierszach w pliku i uzyskać linię, w której znaleziono dopasowanie.
Jednak moim problemem jest to, że plik zawiera jeden bardzo długi ciąg, a nie, tzn. Słowa, i chcę wyszukać podsekwencję tego długiego łańcucha. Dlatego nie mogę używać programu pcregrep i po prostu wyszukać słowo1 \ nword2. Ponieważ tak naprawdę chcę uzyskać numer linii, w której znaleziono dopasowanie, nie mogę po prostu usunąć wszystkich znaków nowej linii ...
Oto przykład, jak wygląda mój plik. Właśnie napisałem wielką literę pasującego łańcucha, abyś mógł go znaleźć:
Ciąg do wyszukiwania:
gcbcdbfceebcfhfchaaccdgfcegffgedffaeaedcbaedhacebeeebcechbcbfeeccbdhcbfg
Plik do przeszukania:
abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
abcdeabcde***GCBCDBFCEEBCFHFCHAACCDGFCEGFFGEDFFAEAEDC
BAEDHACEBEEEBCECHBCBFEECCBDHCBFG***ggfbhbgcedabceedfa
fbaaechaabdbffbebecebaacfcfcdcggfchddcefbcbdegbbba
Czy ktoś z was ma na to łatwe rozwiązanie?
Jeśli nie ma do tego dostępnego narzędzia, napisałbym po prostu krótki skrypt Pythona, aby to zrobić, ale wydaje mi się, że każde narzędzie bash byłoby bardziej wydajne ...
EDYCJA :
Bardzo dziękuję za odpowiedzi, działają one bardzo dobrze, jeśli pozycja znaku nowej linii jest znana.
Przykro mi jednak z powodu nieprecyzyjności mojego pytania. Mój problem polega na tym, że nie wiem, czy w ciągu znaków w pliku znajduje się nowa linia, a nawet więcej niż jedna nowa linia, a ponadto nie wiem, gdzie ona jest. Poprawiłem ciąg wyszukiwania, usuwając nowy wiersz, który nieświadomie wstawiłem.
Czy jest jakiś sposób, aby zezwolić na znak nowej linii w dowolnej pozycji ciągu?
Zrobiłbym to za pomocą
sed
skryptu. Umieść to w pliku, a następnie użyj,sed -nf
aby go uruchomić.Oto jak to wygląda uruchomić
bash
. Zauważ, że wypisuje numer drugiej dopasowanej linii.źródło
Jestem trochę zdezorientowany, pod jakimi ograniczeniami działasz. Jeśli jednak potrzebujesz numeru linii, zarówno grep, jak i pcregrep mogą dać ci flagę -n.
pcregrep pokazuje tylko numer pierwszego dopasowanego wiersza, najwyraźniej więc będziesz musiał pominąć każdy inny wiersz wyjścia za pomocą sed (potokuj powyżej
sed -n 'p;N'
), jeśli chcesz tylko numery wierszy jako wyjście.źródło