2016-11-03 3 views
1

Hey, also sagen wir, Sie haben eine Zeichenfolge "aabbaabbbaab". Wie Sie sehen können, haben Sie 3 Blöcke von "b". Zum Beispiel, wie entferne ich den 2. Block von b, also "bbb"? Es sollte die Saite in "aabbaaaab" verwandeln. Ich habe versucht, überall hinzuschauen, aber ich konnte mir einfach keine richtige Syntax für meine spezifische Frage vorstellen. Ich muss dies in reiner Bash tun, also keine awk, sed etc.Entfernen eines Blocks eines bestimmten Zeichens in reinem Bash

+2

Falls Sie Ihre Meinung über die "no sed" Anforderung ändern, hier wurde mein GNU sed Antwort: 'sed‚s/b \ + // 2'' – Aaron

+0

@ Aaron Hey, wenn ich schließlich nicht herausfinden kann, wie ich das ohne Sed machen soll, werde ich deinen Ansatz gebrauchen. – foobarbaz

+1

Warum nicht sed oder awk? Dies sind POSIX-Tools und sind zu 99,999% wahrscheinlich überall dort vorhanden, wo BASH vorhanden ist. – dawg

Antwort

1

Hier rein bash: es über den String Zeichen für Zeichen iteriert. Wenn es erkennt, dass es sich im n-ten Block des angegebenen Zeichens befindet, wissen wir, dass die gesamte Zeichenfolge bis hier der erste Teil der Ausgabe ist, die wir wollen. Wenn wir bis zum Ende des n-ten Blocks kommen, wissen wir, dass der Rest der Saite gesucht wird.

remove_nth_block() { 
    local str=$1 char=$2 n=$3 
    local i count=0 prev prefix 
    for ((i=0; i<${#str}; i++)); do 
     if [[ ${str:i:1} = $char && $prev != $char ]]; then 
      ((++count == n)) && prefix=${str:0:i} 
     else 
      if [[ ${str:i:1} != $char && $prev = $char && $count -eq $n ]]; then 
       echo "$prefix${str:i}" 
       return 
      fi 
     fi 
     prev=${str:i:1} 
    done 
} 

Dann

$ remove_nth_block aabbaabbbaab b 2 
aabbaaaab 
$ remove_nth_block aabbaabbbaab a 2 
aabbbbbaab 
+0

Congrats, ich hatte versucht, eine ähnliche Lösung zu machen und es frustriert aufgegeben. 'bash' ist keine so großartige Sprache ohne seine vielfältige Toolbox – Aaron

+0

Und es ist auch sehr langsam. –

1

Dies sollte myString nach dem Ersetzen aller Vorkommen von bbb mit nichts drucken. Für einige wirklich nützliche Tipps und Beispiele für die Manipulation von Strings in bash, check out this Website.

myString="aabbaabbbaab" 
echo ${myString//bbb/} 
+0

Hey danke für die Antwort, ich hätte genauer sein sollen. Ich muss in der Lage sein, den N-ten Block basierend auf Benutzereingaben zu finden. Zum Beispiel, wenn ich "bb" eintippe, bedeutet das, dass ich den zweiten Block von b finden muss und diesen Block entfernen muss. – foobarbaz

Verwandte Themen