Sök och ersätt text i flera dokument från kommandoraden

Om du är bekväm med kommandoraden och någonsin i en situation där du behöver hitta och ersätta ett ord, fras, webbadress eller karaktär över en grupp med flera textdokument, gör jobbet ganska bra. En enkel kommandosträng kommer snabbt att utföra en gruppbatch hitta och ersätta i text, vare sig det är i ett enda dokument eller spänner över en grupp med flera dokument.

Liksom många saker i kommandoraden finns det ingen bekräftelseprocess, så du vill se till att din syntax är korrekt inställd innan du initierar ett kommando, annars kan du behöva göra en annan hitta och ersätt för att reparera din typsnitt.

Den grundläggande kommandotyntaxen är som följer:

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

För ett exempel på ett enda ord, om du behöver ersätta alla instanser av "ogre" med "cornbread" i varje .txt-fil i mappen "Documents", skulle du använda följande kommando:

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

För ett exempel på att hitta och ersätta en hel fras, låt oss anta att vi ska ersätta hela meningen "The Chocolate Factory" med "The Wizard of Oz" i en grupp av .txt-filer som börjar med "Filmer" lagrade i dokumenten katalogen:

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

Fyndet och ersättningen görs omedelbart. Du kan dubbelkontrollera ändringen genom att använda katt och grep för att kontrollera:

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

Visserligen är detta ganska avancerat, och ja, batch hitta och ersätt genom flera dokument kan göras på ett mer användarvänligt sätt genom GUI-appar som TextWrangler och BBEdit, men ibland är kommandoraden bara snabbare för snabba uppgifter som detta och andra som är liknande, plus det kräver inte några ytterligare nedladdningar att använda.

En stor tumme upp till Lifehacker för det utmärkta tricket.

Uppdatering : Kommandot 'sed' är ett annat sätt att snabbt hitta och ersätta via kommandoraden. Omfattande sed är mestadels ett ämne för en annan artikel, men den grundläggande syntaxen att använda sed för denna uppgift är lite enklare och därmed lättare att komma ihåg:

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

Det finns ingen rätt eller fel sätt, så om du använder perl eller sed blir en fråga om personlig preferens.