webForumDet fria alternativet

Grep och awk

7 svar · 274 visningar · startad av Chavez

ChavezMedlem sedan maj 20001 953 inlägg
#1

Hejsan!

Har en liten uppgift. Vill genom bash gå igenom alla filer i en katalog (underkataloger också, rekursivt alltså), öppna dem med filtillägget .ihtml eller .php och sedan inne i dem ersätta modules.php med index.php.

Alltså en search and replace på ett helt katalogträds textfiler.

Har fått förslaget att göra detta med grep och awk. Att köra en grep med flaggan -R och sedan pipa det genom gawk. Men problemet är att jag kan mycket lite om båda. Någon som har lust och hjälpa till? ;)

RobbanMedlem sedan dec. 19992 555 inlägg
#2

Ett exempel med find och sed.

Skapar en scriptfil som find sedan skall köra:

execsed.sh

#!/bin/sh

sed s/modules\.php/index\.php/g $1 > tmpfile
mv tmpfile $1

Sedan används find för att hitta rätt filer:

find ./ \( -name '*.[pP][hH][pP]' -o -name '*.[iI][hH][tT][mM][lL]' \) -exec /path/to/execsed.sh {} \;

Finns säkerligen både bättre och smidigare metoder, men ovanstående bör få jobbet gjort.

ChavezMedlem sedan maj 20001 953 inlägg
#3

Vad gör skripten ovan? Ersätter de alla förekommster av modules.php i alla .php och .ihtml filer med index.php? Det är alltså texten i filerna som är det viktiga, inte filnamnen. Kan nämligen inte se det i skripten. Men det är förmodligen jag som inte kan :)

GunnarDMedlem sedan juni 20014 290 inlägg
#4

find kommandot letar efter alla .php och alla .html filer den hittar från där du står och neråt i katalogstrukturen.

För varje fil den hittar kör den execsed.sh med filensnamn som argument (inklusive väg från där du står).
sed programet byter sedan ut alla modules.php til index.php den hittar i filen och skriver ut resultatet till filen zzz, zzz flyttas sedan så att den ersätter den ursprunliga filen.

ChavezMedlem sedan maj 20001 953 inlägg
#5

Tackar för den förklaringen! Förlåt att jag tvivlade på dig Robban §e

ChavezMedlem sedan maj 20001 953 inlägg
#6

Hmm då är jag här igen. Varför dummar sig mitt skal med och ge felmeddelanden på ditt skript Robban? :)

./execsed.sh: gt: command not found
./execsed.sh: tmpfile: command not found
mv: cannot stat "tmpfile": Filen eller katalogen finns inte

Vadå gt? De två sista felmeddelandena kommer ju som på köpet efter det första.

GunnarDMedlem sedan juni 20014 290 inlägg
#7

Kolla att du verkligen har > tecknet i sed raden, inte >

ChavezMedlem sedan maj 20001 953 inlägg
#8

Nu känner jag mig dum. Hade tänkt och använda samma skript till en ny uppgift. Att ersätta mysql_query( med $db->sqlQuery men får det inte att funka! Någon?

133 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)