2017-05-22 4 views
0

Der String ist: fs=/apps/ow/abc/xyz/def/Können/Apps aus einer Variablen mit/apps/ow/... in einer Zeile extrahiert werden?

IFS=/ read -r fs fs rest <<< "$fs" 
fs="/"$fs 

ich nur /apps nur erste Teil heißt ausgegeben extrahieren möchte, sollte - in einem Liner.

Es gibt verschiedene Techniken einschließlich Lese-und String-Löschung in Bash, aber ich möchte Single-Liner eingebauten Bash-Befehl ohne externe Bash-Befehl verwenden.

+2

Im Allgemeinen sind Quests für einen Einzeiler eine schlechte Idee. Sie sollten versuchen, lesbaren, wartbaren Code zu erstellen, nicht Code, der auf kluge Weise knapp ist. –

+1

@Aaron, das müsste '<<<" $ fs "' sein, und es schneidet die führende '/'. Es ist auch extrem ineffizient zur Laufzeit, da es ein externes Tool nur für die Verarbeitung einer Zeile in Gang setzt. Native String-Manipulationen, wie sie in [BashFAQ # 100] (http://mywiki.wooledge.org/BashFAQ/100) angegeben sind, sind im Allgemeinen vorzuziehen - obwohl, wenn das OP * wahrhaftig * Knappheit bevorzugt, sie vielleicht * etwas * wollen ein Befehl dauert aber 100 mal länger, im Gegensatz zu zwei separaten internen Befehlen? –

+0

@CharlesDuffy right, danke für die Info – Aaron

Antwort

3

Der einzige Befehl:

[[ $fs =~ ^(/[^/]+)/ ]] 

... wird das gewünschte Ergebnis (/apps) zu ${BASH_REMATCH[1]} zuweisen.

+0

Danke. Es klappt. –

+0

Andere Möglichkeit könnte sein: x = $ {fs #?} && fs = "/" $ {x %%/*} –

+0

@AshwaniKumar, würde ich '$ {fs # /}' - so bevorzugen Wir beschneiden nur den Charakter, von dem wir erwarten, dass er anwesend ist. Und Sie müssen nicht das "/", das konstant ist, zitieren, wenn Sie etwas zitieren wollen (was in einer Aufgabe optional ist), stellen Sie sicher, dass Sie die * Erweiterung * angeben, was ist kann (in Nicht-Zuordnungskontexten) * quotieren, um String-Splitting- und Globbing-Verhalten zu unterdrücken. Also, x = $ {fs # /}; fs =/$ {x %%/*} 'oder' x = "$ {fs # /}"; fs = "/ $ {x %%/*}" ' –

Verwandte Themen