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.