Mam ciąg, którym chciałbym manipulować. Ciąg jest w H08W2345678
jaki sposób mógłbym nim manipulować, aby wynik był po prostu W2345678
?
Podobnie, jeśli chcę usunąć ostatnie 4 znaki, H08W2345678
aby uzyskać, H08W234
jak to zrobić?
bash
shell
text-processing
sed
3kstc
źródło
źródło
sed
?H08W2345678
i muszę go zmanipulować.W2345678
Ta wartość z innymi danymi zostanie umieszczona w wysłanej wiadomości e-mail. Ten e-mail zostanie wysłany z cronem.awk
ing. Tworzę tablicę, a następnie modyfikuję każdy element w tablicy (wszystko inaczej - tj. Zmieniam znacznik czasu Epoki w sekundach na datę itp.)printf %s\\n "XX,H08W2345678,YY" | awk -F, '{print substr($2, 4); print substr($2, 1, length($2)-4)}'
Odpowiedzi:
Wystarczy użyć bash (lub
ksh93
skąd pochodzi ta składnia lubzsh
):Zobacz wiki Wooledge, aby uzyskać więcej informacji na temat manipulacji ciągami .
źródło
"${string:0:${#string}-4}"
Działa w wersji bash 4.1, o ile długość$string
wynosi co najmniej 4.abc-e
, w których po upuszczeniu pierwszych trzech znaków pozostaniesz-e
(ponieważecho -e
nie robi tego, co chcesz).sed 's/^.\{3\}//'
znajdzie pierwsze trzy znaki^.\{3\}
i zastąpi je spacją. Tutaj^.
dopasuje dowolny znak na początku łańcucha (^
wskazuje początek łańcucha) i\{3\}
dopasuje poprzedni wzór dokładnie 3 razy. Dopasuje więc^.\{3\}
pierwsze trzy znaki.Podobnie,
sed 's/.\{4\}$//'
zastąpi ostatnie cztery znaki spacją ($
wskazuje koniec ciągu).źródło
's/^.\{3\}//'
a's/.\{4\}$//'
ponieważ wciąż się uczę, bardzo dziękuję...
zamiast.\{3\}
od (dla mnie) jest to łatwiejsze do odczytania:sed -e 's/^...//' -e 's/....$//'
albo w jednym wyrażeniu z naprzemiennie:sed -r 's/^...|....$//g'
. Gdyby usunąć więcej niż kilka znaków, użyłbym tego/.\{17}\/
wyrażenia zamiast/.............../
.-e
lub-n
. Oczywiście, znaczenie „drop ostatnie 4 znaki” jest niezdefiniowana dla ciąg znaków krótszym niż 4, ale jeśli ktoś chce przystosować to do spadku pierwszy lub ostatni jeden znak, to może wysadzić.Jeśli masz plik, w którym każda linia zawiera jedenastoznakowy (lub dowolny inny) ciąg, który chcesz pociąć,
sed
jest to narzędzie do użycia. Jest w porządku do manipulowania pojedynczym łańcuchem, ale to przesada. W przypadku pojedynczego ciągu odpowiedź Jasona jest prawdopodobnie najlepsza, jeśli masz dostęp do wersji bash 4.2 lub nowszej. Jednak wydaje się , że składnie i są unikalne dla bash (cóż, bash, ksh93, mksh i zsh) - nie widzę ich w Podstawowych specyfikacjach Open Group dla języka poleceń powłoki . Jeśli utkniesz z powłoką zgodną z POSIX, która nie obsługuje rozszerzania podciągów (ekstrakcja), możesz użyć${parameter:offset}
${parameter:offset:length}
używanie
printf
zamiastecho
do ochrony przed ciągami, takimi jakabc-e
, gdy upuszczając pierwsze trzy znaki, pozostajesz-e
(iecho -e
nie robi tego, co chcesz).A jeśli w ogóle nie używasz powłoki z rodziny Bourne (lub używasz starożytnego systemu sprzed POSIX), powinny one nadal działać:
Dodatkowa przestrzeń jest wiodącym w celu uniknięcia problemów z wartościami
$string
, które są rzeczywisteexpr
operatorzy (np+
,/
,index
lubmatch
) lub opcji (np--
,--help
lub--version
).źródło
X
; npexpr "X$string" : 'X...\(.*\)'
. IMO, to łatwiejsze do odczytania i zrozumienia. Czy jest z tym jakiś problem lub powód, aby preferować przestrzeń? (3) Dzisiaj dowiedziałem się, żeexpr + "$string" : '...\(.*\)'
teraz działa. Nie pamiętam tego sprzed 40 lat; czy jest wystarczająco szeroko stosowany, aby go bezpiecznie polecić? (4) Brakowało Ci notki na temat odpowiedzi Jasonwryana i drobiazgowej odpowiedzi Hemayla.expr +
tylko GNU (nie działa na Solarisie ani ABSICS FreeBSD). Używam spacji zamiast x, ponieważ jest mniej prawdopodobne, że niektóreexpr
implementacje będą miały operatory zaczynające się od spacji niż z,x
a także dlatego, że jest mniej prawdopodobne, że będą elementy zestawiające, które zaczynają się od spacji niż zx
. Ale potem zdaję sobie sprawę, że prawdopodobnie nie jest to dobry wybór doexpr " $a" "<" " $b"
porównywania ciągów, ponieważ niektóre implementacje kończą porównanie numeryczne, gdy$a
/$b
wyglądają jak liczby. Możeexpr "@@$a"...
lubexpr "x $a"
może być bezpieczniej.Z:
Dopasowywanie 3 lub 4 znaków wydaje się proste (w przypadku większości powłok):
W przypadku starszych powłok (takich jak powłoka Bourne'a) użyj:
Jeśli jest potrzebna liczbowa liczba znaków, użyj:
Oczywiście, te wyrażenia regularne działają również z sed, awk i bash 3.0+:
źródło
źródło
cut
jest znacznie bardziej elegancka niż cokolwiek innego na tej stronie.