Tips: Byta ut text i en fil

Tråden skapades och har fått 4 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • International user
  • 2005-03-25 20:45

T.ex. byta ut ett IP-nummer i en fil

Lincoln:~ admin$ cat /tmp/test.txt
#Config-fil, typ
#IP-nummer till Oracle SID
IP=172.0.0.1
# Med mer..
Lincoln:~ admin$ cat /tmp/test.txt | sed 's/172.0.0.1/172.0.0.200/g' > /tmp/test.txt
Lincoln:~ admin$ cat /tmp/test.txt
#Config-fil, typ
#IP-nummer till Oracle SID
IP=172.0.0.200
# Med mer..
Lincoln:~ admin$

Bra inlägg. Ett par anmärkningar bara:

1. sed tar som sista argument ett filnamn som processas, finns alltså ingen egentlig anledning att göra en "cat filnamn | sed 'din_regex_här'" utan man kan förenkla det till "sed 'din_regex_här' filnamn" i stället. Man kan också ange en lista av filer på det sättet. Sparar ett par tangenttryckningar iaf

2. Punkt fungerar som wildcard i en regex. En punkt matchar alltså vilket tecken som helst, vilket gör att din regex även glufsar i sig annat än IP-nummer. Prova med "172406021" så får du se. Vill du matcha en punkt måste den escapas med backslash, t.ex. "172\.0\.0\.1"

Sedan tycker jag faktiskt att man ofta kan kasta ut sed när Ruby och Perl faktiskt båda har den funktionaliteten inbakad, hela sh+sed+awk-soppan känns lite för mycket 80-tal för min smak (fast det är ju subjektivt såklart). Brukar själv köra med tumregeln att när ens shellscript börjar behöva en massa anrop till sed är det dags att sätta sig ner och fundera igenom om det egentligen är så lyckat att utföra den aktuella uppgiften med just shellscript. Men som alltid finns det ju specialfall där det faktiskt är motiverat, även om de IMHO inte är så många.

  • Medlem
  • International user
  • 2005-03-26 10:08
Ursprungligen av Samuel K:

Bra inlägg. Ett par anmärkningar bara:

1. sed tar som sista argument ett filnamn som processas, finns alltså ingen egentlig anledning att göra en "cat filnamn | sed 'din_regex_här'" utan man kan förenkla det till "sed 'din_regex_här' filnamn" i stället. Man kan också ange en lista av filer på det sättet. Sparar ett par tangenttryckningar iaf

Där har du lite fel: "sed 'din_regex_här' filnamn" ändrar inte i filen.

Ursprungligen av Wire:

Där har du lite fel: "sed 'din_regex_här' filnamn" ändrar inte i filen.

Ehm, det gör inte "cat filnamn | valfritt_kommando" heller, så jag antar att du missförstod mig. I vilket fall måste man alltså skicka ner utresultatet i en fil med t.ex. >-operatorn.

Ursprungligen av Samuel K:

Sedan tycker jag faktiskt att man ofta kan kasta ut sed när Ruby och Perl faktiskt båda har den funktionaliteten inbakad, hela sh+sed+awk-soppan känns lite för mycket 80-tal för min smak (fast det är ju subjektivt såklart). Brukar själv köra med tumregeln att när ens shellscript börjar behöva en massa anrop till sed är det dags att sätta sig ner och fundera igenom om det egentligen är så lyckat att utföra den aktuella uppgiften med just shellscript. Men som alltid finns det ju specialfall där det faktiskt är motiverat, även om de IMHO inte är så många.

hehe, funkar det så funkar det
Det sagt så hade jag nog kört med följande perlsnutt för samma operation (men smaken är som gawken^H^H^H^H^H^H baken)

perl -pi.bak -e 's/172\.0\.0\.1/172.0.0.200/g' test.txt

Att spara .bak är ju givetvis optional, men kan vara rätt bra att ha ifall man gör bort sig med sin regex..

1
Bevaka tråden