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
Antwort
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
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
Und es ist auch sehr langsam. –
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/}
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
- 1. Entfernen eines bestimmten Zeichens aus dem Text in Spark
- 2. Ersetzen eines bestimmten Zeichens zwischen bestimmten Zeichen in einer Zeichenfolge
- 3. Suchen eines bestimmten Zeichens in SQL-Anweisung
- 4. Entfernen eines Zeichens in einer Zeichenfolge nacheinander
- 5. Vergleichen eines bestimmten Zeichens eines Array-Index in Ruby
- 6. Auswählen eines bestimmten Zeichens im Array
- 7. Entfernen eines Zeichens aus dem gesamten Datenrahmen
- 8. Entfernen eines Zeichens aus einer Zeichenfolge
- 9. Einfügen eines Zeichens vor jeder Instanz eines bestimmten Zeichens in vi
- 10. Variable außerhalb eines Blocks innerhalb eines Blocks setzen?
- 11. EXC_BAD_ACCESS Aufruf eines Blocks
- 12. UINavigationController innerhalb eines Blocks
- 13. Suchen eines bestimmten Zeichens in einer Zeichenfolge in Matlab
- 14. Entfernen eines optionalen/(Verzeichnisseparators) in Bash
- 15. Preprocessor stringificaton eines Zeichens
- 16. Konvertieren eines Zeichens in keycode
- 17. Zeiger eines Zeichens in C++
- 18. Entfernen eines Zeichens aus einer Zeichenfolge in C
- 19. Entfernen des letzten Zeichens eines Feldes in mysql
- 20. Entfernen eines Zeichens von Elementen in einem Datenrahmen
- 21. Anzahl der Vorkommen eines Zeichens in NSString
- 22. Wie alle Vorkommen eines bestimmten Zeichens aus Zeichenfolge in C entfernen?
- 23. Entfernen nur eines bestimmten Werts in Spotfire
- 24. Ausnahme innerhalb eines finally-Blocks
- 25. Schwache Referenzen innerhalb eines Blocks
- 26. Entfernen eines Wertes von Array mit reinem Javascript
- 27. Horizontale Ausrichtung eines Inline-Blocks
- 28. Codierung eines Objective-c-Blocks?
- 29. Regex-Übereinstimmung bis zur ersten Instanz eines bestimmten Zeichens
- 30. Überprüfen Sie die ungerade Zahl eines bestimmten Zeichens
Falls Sie Ihre Meinung über die "no sed" Anforderung ändern, hier wurde mein GNU sed Antwort: 'sed‚s/b \ + // 2'' – Aaron
@ Aaron Hey, wenn ich schließlich nicht herausfinden kann, wie ich das ohne Sed machen soll, werde ich deinen Ansatz gebrauchen. – foobarbaz
Warum nicht sed oder awk? Dies sind POSIX-Tools und sind zu 99,999% wahrscheinlich überall dort vorhanden, wo BASH vorhanden ist. – dawg