Find og erstat tekst i flere dokumenter fra kommandolinjen

Hvis du er fortrolig med kommandolinjen og nogensinde i en situation, hvor du skal finde og erstatte et ord, en sætning, en URL eller et tegn på tværs af en gruppe af flere tekstdokumenter, gør jobbet ganske godt. En enkel kommandostreng vil meget hurtigt udføre en gruppebatch finde og erstatte på tekst, uanset om det er i et enkelt dokument eller spænder over en gruppe af flere dokumenter.

Ligesom mange ting i kommandolinjen er der ingen bekræftelsesproces, så du vil sørge for at din syntaks er indstillet korrekt, før du starter en kommando, ellers kan du muligvis gøre en anden find og erstat for at reparere din typografi.

Den grundlæggende kommandosyntax er som følger:

perl -pi -w -e 's/THIS/THAT/g;' /path/to/files*.txt

For et enkeltordeksempel skal du bruge følgende kommando, hvis du skal erstatte alle forekomster af "ogre" med "cornbread" i hver .txt-fil i mappen "Dokumenter".

perl -pi -w -e 's/ogre/cornbread/g;' ~/Documents/*.txt

For et eksempel på at finde og erstatte en hel sætning, lad os antage, at vi skal erstatte hele sætningen "The Chocolate Factory" med "The Wizard of Oz" i en gruppe af .txt-filer, der starter med "Film", der er gemt i Dokumenterne vejviser:

perl -pi -w -e 's/The Chocolate Factory/The Wizard of Oz/g;' ~/Documents/Films*.txt

Søgningen og udskiftningen sker straks. Du kan dobbelttjekke ændringen ved hjælp af kat og grep for at tjekke:

cat ~/Documents/Films124.txt |grep "Wizard of Oz"

Ganske vist er dette ret avanceret, og ja, batch find og erstatte via flere dokumenter kan gøres på en mere brugervenlig måde gennem GUI apps som TextWrangler og BBEdit, men nogle gange er kommandolinjen bare hurtigere for hurtige opgaver som dette og andre, der er ens, plus det kræver ikke yderligere downloads til brug.

En stor tommelfingre op til Lifehacker for det fremragende trick.

Opdatering : Kommandoen 'sed' er en anden måde at gøre hurtig søgning og erstatte via kommandolinjen. Dække sed er for det meste et emne for en anden artikel, men den grundlæggende syntaks for at bruge sed til denne opgave er lidt enklere og dermed lettere at huske:

sed -i 's/THIS/THAT/g' /path/to/files*.txt

Der er ingen rigtig eller forkert måde, så hvad enten du bruger perl eller sed bliver et spørgsmål om personlig præference.