2017-01-10 2 views
0

Also fragte ich eine Frage, wo ich nur drei Zeichen (die Erlaubnis diejenigen: r, w und x) aus einer Zeichenfolge, wo der Benutzer was auch immer schreiben könnte filtern wollte. Wenn der Benutzer rwx schreibt, werden diese drei Buchstaben in einer Zeichenfolge gespeichert. Die Reihenfolge spielt keine Rolle (wenn der Benutzer wxr schreibt, wird es trotzdem gespeichert). Aber in dem Fall, dass der Benutzer zum Beispiel zrx schreibt, speichert es nur in der Zeichenkette das r und das x. Wenn der Benutzer mehr Zeichen wie zhdghr schreibt, speichert er nur das r. Und wenn der Benutzer rrx schreibt, wird nur ein r und das x gespeichert. Nicht verdoppelt.Filter 3 Zeichen (Berechtigungen) in Bash

Ich habe diese Lösung, aber es ermöglicht die doppelte Antwort.

re='^[rwx]+$' 

s='rw' 
[[ $s =~ $re ]] && echo "yes" || echo "no" 
yes 

s='zr' 
[[ $s =~ $re ]] && echo "yes" || echo "no" 
no 
+1

Es ist die gleiche Frage, warum es wieder fragen? Wenn die Antwort auf Ihre vorherige Frage nicht Ihren Erwartungen entspricht, können Sie sie nicht akzeptieren. Sie können immer noch dem Antworter danken und seine Antwort auffrischen, und ihn bitten, – dudu721

Antwort

0
$ echo rrmoewrigowpfovmslfdkmvsx| grep -o "[rwx]"|sort -u|tr -d "\n" 
rwx 

In der realen Welt verwenden wir Oktal-Modus für Dateiberechtigungen, die einfacher zu analysieren ist.

+0

zu vervollständigen Danke! Es ist nur ein kleines Programm, also wird es perfekt funktionieren! –

0

können Sie grep -o mit awk kombiniert verwenden:

grep -o '[rwx]'<<<"rrx" | awk '!seen[$0]++{} END{for (i in seen) printf "%s", i; print ""}' 

xr 

Und

grep -o '[rwx]'<<<"zhdghr" | awk '!seen[$0]++{} END{for (i in seen) printf "%s", i; print ""}' 

r 

Oder hier ist eine reine awk Lösung:

awk 'BEGIN{FS=""} {for (i=1; i<=NF; i++) if ($i ~ /^[rwx]$/) !seen[$i]++} END{for (i in seen) printf "%s", i; print ""}' <<< 'zhdghr' 

r 

awk 'BEGIN{FS=""} {for (i=1; i<=NF; i++) if ($i ~ /^[rwx]$/) !seen[$i]++} END{for (i in seen) printf "%s", i; print ""}' <<< 'rrx' 

xr 
1

ich denke, die einfachste Art und Weise zu überprüfen ist, wenn die Zeichenfolge r,enthältoder x getrennt. Wenn die Zeichenfolge r enthält, fügen Sie r zu dem Ergebnis, usw.

Beispiel

read -r s 

perm= 
for p in r w x; do 
    [[ "$s" == *"$p"* ]] && perm="${perm}$p" 
done 

printf '%s\n' "$perm" 
+0

Werden die "read -w s" und "read -x s" es mit der gleichen Schleife tun? Nur diese erste Zeile ändern? –

+0

@ M.K liest die eingebaute Funktion 'read' eine Zeile von der Standardeingabe (insbesondere); Die Option '-r' deaktiviert die Interpretation des Backslashs als Escape-Zeichen. Die Option wird häufig verwendet, um unerwartetes Verhalten aufgrund möglicher Interpretation einiger Sequenzen, wie zum Beispiel "\ t", zu vermeiden. Siehe 'info bash read' für Details. –