2012-07-13 9 views
76

Piszę skrypt powłoki dla wbudowanego systemu Linux w małym pudełku przemysłowym. Mam zmienną zawierającą tekst pid: 1234 i chcę usunąć pierwsze znaki X z linii, więc pozostało tylko 1234. Mam więcej zmiennych, których potrzebuję, aby "wyczyścić", więc muszę odciąć X pierwsze znaki, a ${string:5} nie działa z jakiegoś powodu w moim systemie.Jak mogę usunąć pierwsze znaki X ze stringów za pomocą sed?

Jedyna rzecz, jaką wydaje się mieć pudełko to: sed.

Próbuję dokonać następujących pracy:

result=`echo "$pid" | sed 's/^.\{4\}//g'` 

jakieś pomysły?

+6

Jeśli '$ {string: 5}' nie działa, to nie używasz Bash ani innej powłoki, która obsługuje tę składnię. Z jakiej powłoki i wersji korzystasz? Jak wygląda twój shebang? Domyślam się, że używasz 'sh' (np.' Dash') lub ewentualnie 'zsh'. –

Odpowiedz

17

ta wykona pracę za:

echo "$pid"|awk '{print $2}' 
42

Użyj -r opcja ("stosowanie rozszerzonych wyrażeń regularnych w skrypcie") do sed w celu użyć składni {n}:

$ echo 'pid: 1234'| sed -r 's/^.{5}//' 
1234 
+1

Dziękuję, to była szybka odpowiedź! To działa! – Kokesh

+1

jak by to było w przypadku, jeśli chciałbym usunąć ostatnie X znaków z ciągu? – Kokesh

+5

@Kokesh: możesz użyć 'sed -r 's /. {5} $ //'' aby usunąć 5 ostatnich znaków zamiast –

6

Możliwe, że będziesz miał również cut. Jeśli tak, to:

[[email protected]]$ echo "pid: 1234" | cut -d" " -f2 
1234 
+2

Próbowałem już CUT wcześniej, ale możliwości są ograniczone :) – Kokesh

+1

Problemy z ' cut "polega na tym, że nie obsługuje on sensownie ciągów białych znaków, użycie' tr -s '' do "ściśnięcia" spacji sprawia, że ​​zachowuje się lepiej. – Thor

+1

To nie ma być całe śpiewanie całego narzędzia tańca; jest prosty i robi to, co mówi na puszce i jest powszechnie dostępny. Powinno to działać dobrze dla wspomnianych wymagań i jest z pewnością bardziej odporne na przycinanie znaków z określonych pozycji. –

125

Poniższa powinno działać:

var="pid: 1234" 
var=${var:5} 

Czy na pewno bash jest powłoka wykonywania skryptu?

+0

Pracował uczta. –

+4

To powinna być zaakceptowana odpowiedź! – ndmeiri

4

Przeprowadź przez awk '{print substr($0,42)}' gdzie 42 jest o jeden więcej niż liczba znaków do spadku. Na przykład:

$ echo abcde| awk '{print substr($0,2)}' 
bcde 
$ 
45

Oto zwięzła metoda wycinania pierwszych znaków X za pomocą cut(1). Ten przykład usuwa pierwsze 4 znaki.

echo "$pid" | cut -c 4- 
+1

To jest najprostsze rozwiązanie! – Brandon

6

Cut dwa pierwsze znaki z ciągu znaków:

string="1234567890"; echo "${string:2}" 
+0

To nie działa. – luckytaxi

+0

@ dtp70 Dziękuję bardzo ogólna odpowiedź, działało świetnie! – wolfram77

1

Innym sposobem, za pomocą cut zamiast sed.

result=`echo $pid | cut -c 5-` 
+0

Chce usunąć pierwsze 4 znaki. To dostaje pierwsze 4 znaki. –

+1

Zmieniono kod, aby używał wycięcia zamiast głowy. – Evgeny

Powiązane problemy