/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
sed "søg og erstat" eller ??
Fra : Jørgen Lysgaard


Dato : 23-04-03 23:27

Jeg har nogle filer som jeg ønsker at rette via et script, jeg bruger
iøjeblikket patch
men tror der må findes en letter måde.

Her er et udsnit af en af filerne, hvor jeg ønsker at tilføjer de 5 linier
startende med +

Hvordan gør jeg det lettest ?

Klip --
#!/bin/bash
# Begin $rc_base/init.d/rc - Main Run Level Control Script

# Based on rc script from LFS-3.1 and earlier.
# Rewritten by Gerard Beekmans - gerard@linuxfromscratch.org

source /etc/sysconfig/rc
source $rc_functions

trap "" INT QUIT TSTP

[ "$1" != "" ] && runlevel=$1

if [ "$runlevel" = "" ]
then
echo "Usage: $0 <runlevel>" >&2
exit 1
fi

+if [ "$runlevel" = "3" ]
+ then
+ /bin/dmesg -n 3
+fi
+
previous=$PREVLEVEL
[ "$previous" = "" ] && previous=N
Klip --

Med venlig hilsen

Jørgen Lysgaard




 
 
Morten Lund (24-04-2003)
Kommentar
Fra : Morten Lund


Dato : 24-04-03 10:30

Jørgen Lysgaard wrote:

> Her er et udsnit af en af filerne, hvor jeg ønsker at tilføjer de 5 linier
> startende med +
>
> Hvordan gør jeg det lettest ?

Hej - dette er et ikke testet script, men det kan give dig nogle ideer:

Stil dig i biblioteket hvorfra det skal udføres...

Som sagt - scriptet er ikke testet da jeg ikke har valid testdata. Så tag
lige en backup af filerne inden du gør noget, ikk?

---

#!/bin/bash

find . -t f | while read i;
sed -e "s/^+.*//" < $i > $i.tmp
mv $i.tmp $i
done

---

Venlig hilsen
Morten

Peter Makholm (24-04-2003)
Kommentar
Fra : Peter Makholm


Dato : 24-04-03 10:32

Morten Lund <mlu@cryptomathic.com> writes:

> Jørgen Lysgaard wrote:
>
>> Her er et udsnit af en af filerne, hvor jeg ønsker at tilføjer de 5 linier
>> startende med +

> #!/bin/bash
>
> find . -t f | while read i;
> sed -e "s/^+.*//" < $i > $i.tmp
> mv $i.tmp $i
> done

Øhhh, det vil fjerne linjer der begynder med et plus, mens Jørgen
tilsyneladende vil tilføje noget.

--
Peter Makholm | Have you ever felt trapped inside a Klein bottle?
peter@makholm.net |
http://hacking.dk |

Peter Makholm (24-04-2003)
Kommentar
Fra : Peter Makholm


Dato : 24-04-03 10:41

"Jørgen Lysgaard" <j.lysgaard@mail.dk> writes:

> Jeg har nogle filer som jeg ønsker at rette via et script, jeg bruger
> iøjeblikket patch
> men tror der må findes en letter måde.
>
> Her er et udsnit af en af filerne, hvor jeg ønsker at tilføjer de 5 linier
> startende med +

Det er altid det samme der skal tilføjes?

Hvordan finde du ud af hvor det skal tilføjes?

Jeg ville nok lave et lille perl-script ala:

#!/usr/bin/perl -pi

sub insert_now { ... }

if insert_now($_) {
print <<EOF
if [ "$runlevel" = "3" ]
then
/bin/dmesg -n 3
fi

EOF
__END__

Hvor insert_now tjekker at det er nu inden linjen i $_ at tilføjelse
skal indsættes.

--
Peter Makholm | Have you ever felt trapped inside a Klein bottle?
peter@makholm.net |
http://hacking.dk |

Jørgen Lysgaard (24-04-2003)
Kommentar
Fra : Jørgen Lysgaard


Dato : 24-04-03 23:07

Jørgen Lysgaard wrote:
> Jeg har nogle filer som jeg ønsker at rette via et script, jeg bruger
> iøjeblikket patch
> men tror der må findes en letter måde.
>
> Her er et udsnit af en af filerne, hvor jeg ønsker at tilføjer de 5 linier
> startende med +
>
> Hvordan gør jeg det lettest ?
>
> Klip --
> #!/bin/bash
> # Begin $rc_base/init.d/rc - Main Run Level Control Script
>
> # Based on rc script from LFS-3.1 and earlier.
> # Rewritten by Gerard Beekmans - gerard@linuxfromscratch.org
>
> source /etc/sysconfig/rc
> source $rc_functions
>
> trap "" INT QUIT TSTP
>
> [ "$1" != "" ] && runlevel=$1
>
> if [ "$runlevel" = "" ]
> then
> echo "Usage: $0 <runlevel>" >&2
> exit 1
> fi
>
> +if [ "$runlevel" = "3" ]
> + then
> + /bin/dmesg -n 3
> +fi
> +
> previous=$PREVLEVEL
> [ "$previous" = "" ] && previous=N
> Klip --
>
> Med venlig hilsen
>
> Jørgen Lysgaard
>
>
>

Mit største problem med sed er at den version som den LFS 3.3 benytter
er GNU 3.02 som ikke kender "\n"

Jeg har nu fundet følgende løsning :

cp /etc/rc.d/init.d/rc /etc/rc.d/init.d/rc.bak
sed 's/previous=$PREVLEVEL/if [ "$runlevel" = "3" ]£then£ \
\/bin\/dmesg -n 3£fi££previous=$PREVLEVEL/' /etc/rc.d/init.d/rc.bak | \
tr "£" "\n" > /etc/rc.d/init.d/rc

Det virker fint, men er det til at forstå hvad der sker ?

Jørgen Lysgaard


Peter Dalgaard BSA (25-04-2003)
Kommentar
Fra : Peter Dalgaard BSA


Dato : 25-04-03 00:30

Jørgen Lysgaard <j.lysgaard@mail.dk> writes:


> Jeg har nu fundet følgende løsning :
>
> cp /etc/rc.d/init.d/rc /etc/rc.d/init.d/rc.bak
> sed 's/previous=$PREVLEVEL/if [ "$runlevel" = "3" ]£then£ \
> \/bin\/dmesg -n 3£fi££previous=$PREVLEVEL/' /etc/rc.d/init.d/rc.bak | \
> tr "£" "\n" > /etc/rc.d/init.d/rc
>
> Det virker fint, men er det til at forstå hvad der sker ?

Det her er nok nemmere, men pas på med ting der skal \-escapes:

sed -f - test.txt << EOF
/previous=\$P/i\\
if [ "$runlevel" = "3" ]\\
then\\
/bin/dmesg -n 3\\
fi
EOF

--
O__ ---- Peter Dalgaard Blegdamsvej 3
c/ /'_ --- Dept. of Biostatistics 2200 Cph. N
(*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk) FAX: (+45) 35327907

Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408852
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste