webForumDet fria alternativet
Logga in / Bli medlem

Grep och awk

Linux & BSD

7 svar · 274 visningar · startad av Chavez

Medlem sedan maj 20001 953 inlägg
Frågan#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? ;)

Medlem 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.

Medlem 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 :)

Medlem 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.

Medlem sedan maj 20001 953 inlägg
#5

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

Medlem 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.

Medlem sedan juni 20014 290 inlägg
#7

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

Medlem 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?

251 ms totalt · 4 externa anrop · v20260731065814-full.bde7d14f
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)