Muszę zidentyfikować pozycję znaku w ciągu za pomocą polecenia grep.
Przykład: ciąg to RAMSITALSKHMAN|1223333
.
grep -n '[^a-zA-Z0-9\$\~\%\#\^]'
Jak znaleźć pozycję |
w danym ciągu?
text-processing
grep
string
użytkownik82782
źródło
źródło
Odpowiedzi:
Możesz użyć,
-b
aby uzyskać przesunięcie bajtu, które jest takie samo jak pozycja dla prostego tekstu (ale nie dla UTF-8 lub podobnego).Powyżej używam
-a
przełącznika, aby powiedzieć grepowi, aby używał danych wejściowych jako tekstu; konieczne podczas pracy na plikach binarnych, a-o
przełącznik wyświetla tylko pasujące znaki.Jeśli chcesz tylko pozycję, możesz użyć grep, aby wyodrębnić tylko pozycję:
Jeśli otrzymasz dziwny wynik, sprawdź, czy grep ma włączone kolory. Możesz wyłączyć kolory, przechodząc
--colors=never
do grep lub poprzedzając polecenie grep znakiem\
(który wyłączy wszelkie aliasy), np .:W przypadku ciągu, który zwraca wiele dopasowań, przeciągnij,
head -n1
aby uzyskać pierwsze dopasowanie.Zauważ, że używam obu z powyższych, i zauważ, że ten ostatni nie będzie działał, jeśli grep jest „aliasowany” przez plik wykonywalny (skrypt lub w inny sposób), tylko przy użyciu aliasów.
źródło
2
;)^
:)0:|
jako wynik - ponieważ 0 to bajtowa pozycja początku wiersza, w którym się|
znajduje.grep (GNU grep) 2.27
. Być może używasz OS X?Próbować:
wynik:
To da ci pozycję z indeksem opartym na 1.
źródło
printf '%s\n' '|' | grep -o . | grep -n '|'
wydruki1
niezgodne z0
oczekiwaniami.Jeśli używasz powłoki bash , możesz korzystać z czysto wbudowanych operacji bez potrzeby odradzania procesów zewnętrznych, takich jak grep lub awk :
Wykorzystuje to rozszerzenie parametrów, aby usunąć wszystkie wystąpienia
|
następujących po dowolnym ciągu i zapisać je w zmiennej tymczasowej. W takim przypadku wystarczy zmierzyć długość zmiennej tymczasowej, aby uzyskać indeks|
.Zauważ, że
if
sprawdza, czy|
w ogóle istnieje w oryginalnym ciągu. Jeśli tak nie jest, zmienna tymczasowa będzie taka sama jak pierwotna.Zauważ też, że zapewnia to indeks zerowy,
|
który jest ogólnie przydatny podczas indeksowania ciągów bash. Jeśli jednak potrzebujesz indeksu opartego na jednym, możesz to zrobić:źródło
Możesz użyć
index
funkcji awk, aby zwrócić pozycję w znakach, w których występuje dopasowanie:Jeśli nie masz nic przeciwko użyciu funkcji Perla
index
, obsługuje to zgłaszanie zera, jednego lub więcej wystąpień znaku:Tylko w celu zapewnienia czytelności potok został podzielony na dwie linie.
Dopóki znak docelowy zostanie znaleziony,
index
zwraca wartość dodatnią w oparciu o zero (0). Stąd ciąg „abc | xyz | 123456 | zzz |” po przeanalizowaniu zwraca pozycje 0, 4, 8, 15 i 19.źródło
RAMSITALSKHMAN|1|223333
Możemy to również zrobić za pomocą „dopasowania wyrażenia” lub „indeksu wyrażenia”
wyrażenie dopasowuje $ string $ substring, gdzie $ substring jest RE.
A powyżej da ci pozycję, ponieważ zwraca dopasowaną długość podłańcucha.
Ale aby być bardziej szczegółowym w wyszukiwaniu indeksu:
źródło
awk
rozwiązania można w trywialny sposób modyfikować w celu zgłaszania tych informacji w każdym wierszu pliku (wszystko, co musisz zrobić, to usunąćEND
odpowiedź JRFergusona, która nigdy nie była tak naprawdę konieczna, a Avinash Raj już to robi) ; mając na uwadze, że aby to zrobić za pomocąexpr
rozwiązania, należy dodać wyraźną pętlę (a odpowiedź Gnouca nie jest łatwa do dostosowania, aby to zrobić w ogóle, co widzę), oraz (2)awk
rozwiązania można dostosować do zgłaszania wszystkich dopasowuje się w każdej linii nieco łatwiej niżexpr
rozwiązanie (w rzeczywistości Avinash Raj już to robi).echo `...`
tu skorzystać ?Kolejne polecenie awk ,
Ustawiając separator pól jako ciąg zerowy, awk zamienia pojedynczy znak w rekordzie jako osobne pola.
źródło
niektóre alternatywy obejmują:
podobny do odpowiedzi Gnouca, ale z powłoką:
z
sed
idc
prawdopodobnie obejmujący wiele linii:z
$IFS
...To będzie również powiedzieć, jak wiele istnieje jak ...
źródło