Piszę skrypt powłoki dla wbudowanego Linuksa w małym przemysłowym pudełku. Mam zmienną zawierającą tekst pid: 1234
i chcę usunąć pierwsze X znaków z linii, więc pozostaje tylko 1234. Mam więcej zmiennych, które muszę „wyczyścić”, więc muszę wyciąć X pierwszych znaków iz ${string:5}
jakiegoś powodu nie działa w moim systemie.
Wydaje się, że jedyne, co ma to pudełko, to sed
.
Próbuję, aby zadziałało:
result=$(echo "$pid" | sed 's/^.\{4\}//g')
Jakieś pomysły?
${string:5}
nie działa, nie używasz Bash ani innej powłoki obsługującej tę składnię. Jakiej powłoki i wersji używasz? Jak wygląda twój shebang? Domyślam się, że używaszsh
(np.dash
) Lub prawdopodobniezsh
.Odpowiedzi:
To też wykona zadanie:
źródło
awk -F": " '{print $2}'
. Jednak nie jest to moje ulubione rozwiązanie.Powinno działać:
Czy na pewno
bash
powłoka wykonuje Twój skrypt?Nawet zgodny z POSIX
byłoby lepsze niż użycie procesu zewnętrznego, chociaż wymaga to sztywnego zakodowania 5 w postaci wzorca o stałej długości.
źródło
${var:5:2}
rozpocznie się o1
i wróci12
.Oto zwięzła metoda wycinania pierwszych znaków X za pomocą
cut(1)
. Ten przykład usuwa pierwsze 4 znaki, wycinając podciąg zaczynający się od piątego znaku.źródło
git log --pretty=oneline | cut -c 42- | head
cut -c ${LEN}-
. Nawiasy klamrowe służą do konkatenacji ciągu z prawidłowymi znakami zmiennych, aby odróżnić, co jest zmienną, a co nią nie jest. Jeśli chcesz uzyskać więcej informacji na ten temat, poszukaj „konkatenacji łańcuchów zmiennych bash”, aby uzyskać więcej informacji o tym, dlaczego / jak to działa.Użyj
-r
opcji ("użyj rozszerzonych wyrażeń regularnych w skrypcie")sed
aby użyć{n}
składni:źródło
sed -r 's/.{5}$//'
zamiast tego możesz usunąć ostatnie 5 znaków-r
(-E
w OS X, IIRC), jeśli unikniesz nawiasów klamrowych (nie wiem, czy to działa w OS X).-r
/-E
) działa w systemie OS X.Wytnij pierwsze dwa znaki z ciągu:
źródło
przepuść go
awk '{print substr($0,42)}'
tam, gdzie 42 jest o jeden więcej niż liczba znaków do usunięcia. Na przykład:źródło
Jest szansa, że ty
cut
też. W takim razie:źródło
cut
polega na tym, że nie radzi sobie rozsądnie z sekwencjami białych znaków, a użycietr -s ' '
do „ściśnięcia” spacji sprawia, że zachowuje się lepiej.Cóż, nie było tu rozwiązania z
sed
,awk
,cut
i stosującbash
składnię. Chcę tylko dorzucić inny wariant zgodny z POSIX:-c
mówi tailowi, od którego offsetu bajtu ma się rozpocząć, licząc od końca danych wejściowych, ale jeśli liczba zaczyna się od+
znaku, to od początku danych wejściowych do końca.źródło
Inny sposób, używając
cut
zamiastsed
.źródło
Znalazłem odpowiedź w czystym sedzie dostarczonym przez to pytanie (wprawdzie opublikowane po opublikowaniu tego pytania). Robi dokładnie to, o co prosiłeś, wyłącznie w sed:
Kropka w
sed '/./
) to wszystko, co chcesz dopasować. Twoje pytanie jest dokładnie tym, co próbowałem, z wyjątkiem tego, że w moim przypadku chciałem dopasować konkretną linię w pliku, a następnie odkomentować ją. W moim przypadku było to:-i
Posed
to, aby edytować plik w miejscu (usunąć ten przełącznik, jeśli chcesz przetestować wyraz pasujący przed edycję pliku).(Opublikowałem to, ponieważ chciałem to zrobić całkowicie z sedem, ponieważ zadawano to pytanie i żadna z poprzednich odpowiedzi nie rozwiązała tego problemu).
źródło
Zamiast usuwać n znaków od początku, możesz po prostu bezpośrednio wyodrębnić cyfry. Tak jak tak ...
Może to być solidniejsze rozwiązanie i wydaje się bardziej intuicyjne.
źródło