Redigera filer på plats med kommandoradsenradare

Bash:
Redigera filer på plats med kommandoradsenradare

Hur:

När det gäller att redigera filer på plats med Bash, kommer två framstående verktyg i spel: sed och awk. Låt oss utforska hur man använder dessa kraftfulla verktyg med några kodexempel.

Använda sed för enkel textersättning

Följande kommando ersätter första förekomsten av “text1” med “text2” i file.txt:

sed -i 's/text1/text2/' file.txt

För en global ersättning (alla förekomster), skulle du lägga till ett g i slutet:

sed -i 's/text1/text2/g' file.txt

För att modifiera flera filer samtidigt:

sed -i 's/text1/text2/g' file1.txt file2.txt file3.txt

Använda awk för mer komplexa manipulationer

awk är ett annat verktyg som utmärker sig med sina programmeringsförmågor, särskilt användbart för textbearbetning som involverar data baserat på fält.

För att ändra det andra fältet i varje rad till newValue i data.csv, åtskilt med kommatecken:

awk -i inplace -F, '{$2="newValue"; print $0}' OFS=, data.csv

Säkerhetskopiera innan du tar steget

Ett praktiskt råd: skapa alltid en säkerhetskopia innan du redigerar på plats. sed underlättar detta med -i-alternativet följt av ett suffix för att skapa en säkerhetskopia.

sed -i.bak 's/text1/text2/g' file.txt

Detta kommando skapar en säkerhetskopia av den ursprungliga file.txt som file.txt.bak innan ersättningen utförs.

Djupdykning

Förmågan att redigera filer direkt från kommandoraden framträdde som en naturlig utveckling av Unix-filosofin: att ge användare möjlighet att effektivt hantera och manipulera data med så få knapptryckningar som möjligt. Dock kommer denna kraft med sina varningar.

Historiskt sammanhang

Unix-verktyg som sed och awk har funnits sedan Unixs tidiga dagar, skapade som en del av dess verktygslådsfilosofi, med fokus på specialiserade, sammanlänkade kommandon. Deras inkludering i Unixs arsenal var ett svar på behovet av effektiv textbearbetning i ett landskap som dominerades av kommandoradsgränssnitt.

Alternativ

Medan sed och awk är kraftfulla, är de inte de enda alternativen. Perl och Python, till exempel, har kommando-linjealternativ (-p och -i, respektive) som tillåter liknande möjligheter till redigering på plats med en möjligtvis mer läslig syntax för komplexa operationer.

perl -pi -e 's/text1/text2/g' file.txt
python -c "import fileinput, sys; [sys.stdout.write(line.replace('text1', 'text2')) for line in fileinput.input(files='file.txt', inplace=True)]"

Varje alternativ har sina styrkor: Perls förmåga att skriva enradarskod är enorm, och Pythons syntax är möjligtvis mer tillgänglig för de som inte är djupt insatta i Unix textbearbetningsverktyg.

Implementeringsdetaljer

Redigering på plats är inte tekniskt sett “på plats” i teknisk mening. Både sed -i och awk -i inplace fungerar genom att skapa en temporär fil där det bearbetade utdata lagras innan den ursprungliga filen ersätts. Detta tillvägagångssätt säkerställer att filen inte korrumperas om processen avbryts. Implikationerna är främst relaterade till resurser och tillstånd: du måste ha tillräckligt med diskutrymme för den temporära filen och behörigheten att skapa filer i katalogen för din målfil.

Medan kraftfulla, måste kommandon för redigering på plats användas med försiktighet. En felplacerad regex kan resultera i dataförlust, vilket betonar vikten av säkerhetskopior. Trots potentiella fallgropar kan mästerskap över dessa kommandon avsevärt öka din förmåga att utföra snabba, effektiva filmodifieringar direkt från kommandoraden, och förkroppsligar Unix-filosofin att använda enkla, kraftfulla verktyg för att utföra komplexa uppgifter.