{"id":637,"date":"2014-05-29T14:27:14","date_gmt":"2014-05-29T12:27:14","guid":{"rendered":"http:\/\/paulchr.ablass.me\/blog\/?p=637"},"modified":"2016-03-06T20:48:15","modified_gmt":"2016-03-06T19:48:15","slug":"ordneruebergreifendes-suchen-und-ersetzen-in-der-bash","status":"publish","type":"post","link":"https:\/\/paulchr.ablass.me\/blog\/2014\/05\/29\/ordneruebergreifendes-suchen-und-ersetzen-in-der-bash\/","title":{"rendered":"Ordner\u00fcbergreifendes Suchen und Ersetzen in der Bash"},"content":{"rendered":"<p>Wer kennt es nicht: In einer gr\u00f6\u00dferen Anzahl von Dateien in verschiedenen Unterordnern soll ein bestimmtes Wort\/ eine Wortgruppe ausgetauscht werden. Prinzipiell eine eher unsch\u00f6ne Situation, die leicht in Arbeit ausarten kann- und das kann ja nun wirklich niemand wollen. Doch halt, Rettung ist in Sicht: In der Bash geht das ordner\u00fcbergreifende Suchen und Ersetzen kinderleicht und superschnell. Alles, was daf\u00fcr gebraucht wird sind die Befehle <code>find<\/code> und <code>sed<\/code> sowie der Parameter <code>xargs<\/code>, <a href=\"2013\/02\/19\/standardeingaben-ausgaben-mit-xargs-in-befehle-umwandeln\/\" title=\"Standardeingaben\/-ausgaben mit xargs in Befehle umwandeln\">der hier auch schon einmal vorgestellt wurde<\/a>.<\/p>\n<h3>Der konkrete Fall<\/h3>\n<p>In meinem Fall handelte es sich um eine Text\u00e4nderung: Der String &#8222;Senderwahl&#8220; sollte in sehr, sehr vielen <a href=\"http:\/\/handlebarsjs.com\/\"><code>.hbs<\/code><\/a>-Dateien zu &#8222;Senderauswahl&#8220; ge\u00e4ndert werden.<\/p>\n<h3>Den Suchstring finden und ersetzen<\/h3>\n<p><code>find<\/code> macht genau das, was der Name vermuten l\u00e4sst: Es findet Dateien und Ordner in einem Verzeichnis. <code>sed<\/code> ist ein skriptgesteuerter Texteditor zum Bearbeiten von <a href=\"http:\/\/de.wikipedia.org\/wiki\/Datenstrom\">Datenstr\u00f6men<\/a>.<\/p>\n<pre><code>$ find . -name \"*.hbs\" -print | xargs sed -i 's\/Senderwahl\/Senderauswahl\/g'<\/code><\/pre>\n<p>Im ersten Teil geben wir s\u00e4mtliche <code>.hbs<\/code>-Dateien im gerade aktiven Ordner und allen Unterordnern als Liste aus (<code>-p<\/code>-Parameter). Das Ergebnis dieser Ausgabe wird mittels <code>xargs<\/code> an den Streameditor <code>sed<\/code> \u00fcbergeben, der in den gefundenen Dateien (<code>-i<\/code>-Parameter) alle Vorkommen von &#8222;Senderwahl&#8220; gegen &#8222;Senderauswahl&#8220; austauscht.<\/p>\n<h3>Links<\/h3>\n<p><a href=\"http:\/\/www.linuxmanpages.com\/man1\/find.1.php\">find manpage<\/a><br \/>\n<a href=\"http:\/\/www.linuxmanpages.com\/man1\/sed.1.php\">sed manpage<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer kennt es nicht: In einer gr\u00f6\u00dferen Anzahl von Dateien in verschiedenen Unterordnern soll ein bestimmtes Wort\/ eine Wortgruppe ausgetauscht werden. Prinzipiell eine eher unsch\u00f6ne Situation, die leicht in Arbeit ausarten kann- und das kann ja nun wirklich niemand wollen. Doch halt, Rettung ist in Sicht: In der Bash geht das ordner\u00fcbergreifende Suchen und Ersetzen [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_newsletter_tier_id":0,"jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[80],"tags":[172,171,30,25],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2Vohc-ah","jetpack-related-posts":[{"id":97,"url":"https:\/\/paulchr.ablass.me\/blog\/2013\/02\/18\/mit-grep-einen-suchstring-in-dateien-eines-verzeichnisses-finden\/","url_meta":{"origin":637,"position":0},"title":"Mit grep einen Suchstring in Dateien eines Verzeichnisses finden","author":"Paul-Christian Abla\u00df","date":"18. Februar 2013","format":false,"excerpt":"paul@athene:\/var\/www\/paulchrablass$ grep -ril --include=\"*.php\" \"class=\\\"special\\\"\" .\/ Durchsucht das aktuelle Verzeichnis \/var\/www\/paulchrablass nach allen .php-Dateien, in denen der String class=\"special\"> vorkommt und spuckt den entsprechenden Dateinamen samt dazugeh\u00f6rigen Pfad aus. Parameter -r = rekursive Suche, d.h. geht auch in Unterordner -i = ignoriert Gro\u00df- und Kleinschreibung -l = gibt nur den\u2026","rel":"","context":"In &quot;Bash&quot;","block_context":{"text":"Bash","link":"https:\/\/paulchr.ablass.me\/blog\/themen\/bash\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":749,"url":"https:\/\/paulchr.ablass.me\/blog\/2014\/12\/19\/mac-os-x-die-bash-vom-terminal-aus-neu-starten\/","url_meta":{"origin":637,"position":1},"title":"Mac OS X: Die Bash vom Terminal aus neu starten","author":"Paul-Christian Abla\u00df","date":"19. Dezember 2014","format":false,"excerpt":"Um ohne System-Neustart\/ Ab- und anschlie\u00dfender Anmeldung \u00c4nderungen an der Shell-Konfiguration vorzunehmen, kann das Shell-BuiltIn source genutzt werden. Was bewirkt source? source f\u00fchrt die als Argument angeh\u00e4ngte Datei in der selben Bash-Umgebung aus. In Verwendung mit den Konfigurationsdateien .bash_profile oder .bashrc erfolgt also ein Neu-Einlesen der Bash-Konfiguration im gleichen Prozess.\u2026","rel":"","context":"In &quot;Bash&quot;","block_context":{"text":"Bash","link":"https:\/\/paulchr.ablass.me\/blog\/themen\/bash\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":775,"url":"https:\/\/paulchr.ablass.me\/blog\/2015\/10\/13\/mac-os-x-autovervollstaendigung-in-der-bash\/","url_meta":{"origin":637,"position":2},"title":"Mac OS X: Autovervollst\u00e4ndigung in der Bash","author":"Paul-Christian Abla\u00df","date":"13. Oktober 2015","format":false,"excerpt":"Um das automatische Vervollst\u00e4ndigen von Befehlen in der Bash f\u00fcr Programme wie Git zu erm\u00f6glichen, empfiehlt sich die Installation Brew-Pakets bash-completion. $ brew install bash-completion Nach der Installation m\u00fcssen die folgenden Zeilen in die .bash_profile-Datei eingetragen werden: if [ -f $(brew --prefix)\/etc\/bash_completion ]; then . $(brew --prefix)\/etc\/bash_completion fi Um das\u2026","rel":"","context":"In &quot;Bash&quot;","block_context":{"text":"Bash","link":"https:\/\/paulchr.ablass.me\/blog\/themen\/bash\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":110,"url":"https:\/\/paulchr.ablass.me\/blog\/2013\/02\/20\/suchen-und-ersetzen-mit-regulaeren-ausdruecken-in-geany\/","url_meta":{"origin":637,"position":3},"title":"Suchen und Ersetzen mit regul\u00e4ren Ausdr\u00fccken in Geany","author":"Paul-Christian Abla\u00df","date":"20. Februar 2013","format":false,"excerpt":"Beim Editieren eines Html-Dokuments stie\u00df ich k\u00fcrzlich auf eine kleine Unannehmlichkeit: Innerhalb eines <a href=\"#\" class=\"chief\">[TEXT]<\/a>-Elements sollten vor dem schlie\u00dfenden Tag noch zus\u00e4tzliche Inhalte eingef\u00fcgt werden. Prinzipiell nicht weiter wild, aber dieses Konstrukt kam \u00fcber 30 Mal im Dokument vor und der Anker-Text \u00e4nderte sich pro Element. Mit einem einfachen\u2026","rel":"","context":"In &quot;Tools&quot;","block_context":{"text":"Tools","link":"https:\/\/paulchr.ablass.me\/blog\/themen\/tools\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":103,"url":"https:\/\/paulchr.ablass.me\/blog\/2013\/02\/19\/standardeingaben-ausgaben-mit-xargs-in-befehle-umwandeln\/","url_meta":{"origin":637,"position":4},"title":"Standardeingaben\/-ausgaben mit xargs in Befehle umwandeln","author":"Paul-Christian Abla\u00df","date":"19. Februar 2013","format":false,"excerpt":"$ grep -ril --include=\"*.php\" \"class=\\\"special\\\"\" .\/ | xargs geany & Erweitert grep um den Befehl, die als Suchergebnis ausgegebenen Dateien in Geany zu \u00f6ffnen. Links xargs im Ubuntuusers-Wiki xargs manpage","rel":"","context":"In &quot;Bash&quot;","block_context":{"text":"Bash","link":"https:\/\/paulchr.ablass.me\/blog\/themen\/bash\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":574,"url":"https:\/\/paulchr.ablass.me\/blog\/2014\/03\/18\/syntaxhighlighting-in-vim-aendern\/","url_meta":{"origin":637,"position":5},"title":"Syntaxhighlighting in vim \u00e4ndern","author":"Paul-Christian Abla\u00df","date":"18. M\u00e4rz 2014","format":false,"excerpt":"Normalerweise erkennt vim den Dateityp einer Datei sehr zuverl\u00e4ssig und wendet das richtige Syntaxhighlighting an. Dieses normalerweise schlie\u00dft allerdings nicht unbedingt das L\u00f6sen von merge-Konflikten mit ein, so dass f\u00fcr diese F\u00e4lle der Dateityp manuell gesetzt beziehungsweise das richtige Syntaxhighlighting aktiviert werden muss. Dazu gibt es den Befehl :set syntax=[Syntaxk\u00fcrzel].\u2026","rel":"","context":"In &quot;Bash&quot;","block_context":{"text":"Bash","link":"https:\/\/paulchr.ablass.me\/blog\/themen\/bash\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/posts\/637"}],"collection":[{"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/comments?post=637"}],"version-history":[{"count":8,"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/posts\/637\/revisions"}],"predecessor-version":[{"id":685,"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/posts\/637\/revisions\/685"}],"wp:attachment":[{"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/media?parent=637"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/categories?post=637"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/paulchr.ablass.me\/blog\/wp-json\/wp\/v2\/tags?post=637"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}