Ich habe eine Zeichenfolge, die ich manipulieren möchte. Die Zeichenfolge ist, H08W2345678
wie ich sie manipulieren kann, damit die Ausgabe gerecht ist W2345678
.
Ebenso, wenn ich die letzten 4 Zeichen löschen wollte, H08W2345678
damit ich bekomme, H08W234
wie würde ich das tun?
bash
shell
text-processing
sed
3kstc
quelle
quelle
sed
?H08W2345678
undW2345678
dieser Wert wird mit einem anderen Datum in eine gesendete E-Mail eingefügt. Das E-Mail-Versenden erfolgt mit cron.awk
ing es. Ich erstelle ein Array und ändere dann jedes Element innerhalb des Arrays (alle unterschiedlich - dh ändere den Epochenzeitpunkt in Sekunden auf ein Datum usw.)printf %s\\n "XX,H08W2345678,YY" | awk -F, '{print substr($2, 4); print substr($2, 1, length($2)-4)}'
Antworten:
Verwenden Sie einfach bash (oder
ksh93
woher diese Syntax kommt oderzsh
):Weitere Informationen zur Manipulation von Saiten finden Sie im Wooledge-Wiki .
quelle
"${string:0:${#string}-4}"
funktioniert in der Bash Version 4.1 , solange die Länge von$string
mindestens 4abc-e
, bei denen Sie beim Ablegen der ersten drei Zeichen übrig bleiben-e
(weil Sieecho -e
nicht das tun, was Sie möchten).sed 's/^.\{3\}//'
findet die ersten drei Zeichen durch^.\{3\}
und ersetzt durch leer. Hier^.
stimmt jedes Zeichen am Anfang der Zeichenfolge überein (^
gibt den Anfang der Zeichenfolge an) und\{3\}
stimmt genau dreimal mit dem vorherigen Muster überein. Also^.\{3\}
werden die ersten drei Zeichen übereinstimmen.In ähnlicher Weise
sed 's/.\{4\}$//'
werden die letzten vier Zeichen durch Leerzeichen ersetzt ($
gibt das Ende der Zeichenfolge an).quelle
's/^.\{3\}//'
und's/.\{4\}$//'
da ich noch sed lerne, vielen Dank...
anstatt.\{3\}
(für mich) ist es einfacher zu lesen:sed -e 's/^...//' -e 's/....$//'
oder in einem einzelnen Ausdruck mit Wechsel :sed -r 's/^...|....$//g'
. Wenn mehr als ein paar Zeichen gelöscht werden müssten, würde ich/.\{17}\/
stattdessen den Ausdruck verwenden/.............../
.-e
oder ist-n
. Natürlich ist die Bedeutung von "die letzten 4 Zeichen löschen" für eine Zeichenfolge mit weniger als 4 Zeichen undefiniert, aber wenn jemand dies anpassen möchte, um das erste oder letzte Zeichen zu löschen, kann dies explodieren.Wenn Sie eine Datei haben, in der jede Zeile eine Zeichenfolge mit elf Zeichen (oder was auch immer) ist, die Sie zerlegen möchten,
sed
ist dies das zu verwendende Werkzeug. Es ist in Ordnung, eine einzelne Saite zu manipulieren, aber es ist übertrieben. Für eine einzelne Zeichenfolge ist Jasons Antwort wahrscheinlich die beste, wenn Sie Zugriff auf Bash-Version 4.2 oder höher haben. Die Syntax und scheinen jedoch nur für bash eindeutig zu sein (well, bash, ksh93, mksh und zsh). Ich sehe sie nicht in den Open Group- Basisspezifikationen für die Shell-Befehlssprache . Wenn Sie mit einer POSIX-kompatiblen Shell nicht weiterkommen, die keine Teilstringerweiterung (Extraktion) unterstützt, können Sie diese verwenden${parameter:offset}
${parameter:offset:length}
Verwenden Sie
printf
stattecho
, um sich vor Zeichenfolgen wie zu schützenabc-e
, bei denen Sie beim Ablegen der ersten drei Zeichen übrig bleiben-e
(undecho -e
nicht das tun, was Sie möchten).Und wenn Sie überhaupt keine Shell der Bourne-Familie verwenden (oder ein altes Pre-POSIX-System verwenden), sollten diese weiterhin funktionieren:
Der zusätzliche führende Raum ist , um Probleme mit den Werten zu vermeiden
$string
Darin sind tatsächlicheexpr
Betreiber (zB+
,/
,index
odermatch
) oder Optionen (zB--
,--help
oder--version
).quelle
X
; zB ,expr "X$string" : 'X...\(.*\)'
. IMO, das ist leichter zu lesen und zu verstehen. Gibt es ein Problem damit oder einen Grund, einen Platz zu bevorzugen? (3) Heute habe ich gelernt, dass dasexpr + "$string" : '...\(.*\)'
jetzt funktioniert. Ich erinnere mich nicht daran von vor 40 Jahren; Ist es weit genug verbreitet, um sicher zu empfehlen? (4) Sie haben eine Notiz zu Jasonwryans Antwort und eine Kleinigkeit zu Heemayls Antwort verpasst.expr +
ist nur GNU (funktioniert nicht unter Solaris oder FreeBSD AFAICS). Ich verwende Leerzeichen anstelle von x, da es weniger wahrscheinlich ist, dass einigeexpr
Implementierungen Operatoren haben, die mit Leerzeichen beginnen als mit,x
und weil es weniger wahrscheinlich ist, dass Elemente zusammengestellt werden, die mit Leerzeichen beginnen als mitx
. Aber dann wird mir klar, dass es wahrscheinlich keine gute Wahl für denexpr " $a" "<" " $b"
String-Vergleich ist, da einige Implementierungen einen numerischen Vergleich durchführen, wenn$a
/$b
wie Zahlen aussehen. Vielleichtexpr "@@$a"...
oderexpr "x $a"
könnte sicherer sein.Mit:
Das Zuordnen von 3 oder 4 Zeichen scheint einfach zu sein (für die meisten Muscheln):
Verwenden Sie für ältere Muscheln (wie die Bourne-Muschel):
Wenn eine numerische Anzahl von Zeichen benötigt wird, verwenden Sie:
Natürlich funktionieren diese Regex auch mit sed, awk und bash 3.0+:
quelle
quelle
cut
ist viel eleganter als alles andere auf dieser Seite.