/ 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
schell script
Fra : carsten


Dato : 05-02-08 09:54

Hej NG
Er ved at forsøge at skrive et schell script, som skal kunde følgend,

finde linjer i filen $1 der starter med include, efter includet står der
nemlig et file navn, disse filer skal derefter gennemsøges en efter en
efter ordet $2, er ordet i en file skal denne fil åbnes i Kate
scriptet køres fra kate, den lille detalje har jeg styr på!
og har fundet de file navne jeg skal bruge, men hvordan kommer jeg vidre
jeg har fundet ud af at kate -u -ln filename åbner filen og placere cursoren
i linje n,

#!/bin/sh
cat $1 |grep include | sed -e 's/include//' | sed -e 's/"//'g




/Carsten

 
 
Klaus Alexander Seis~ (05-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 05-02-08 10:20

Carsten skrev:

> finde linjer i filen $1 der starter med include, efter includet
> står der nemlig et file navn, disse filer skal derefter gennem-
> søges en efter en efter ordet $2, er ordet i en file skal denne
> fil åbnes i Kate scriptet køres fra kate, den lille detalje har
> jeg styr på!
> og har fundet de file navne jeg skal bruge, men hvordan kommer
> jeg vidre jeg har fundet ud af at kate -u -ln filename åbner
> filen og placere cursoren i linje n,
>
> #!/bin/sh
> cat $1 |grep include | sed -e 's/include//' | sed -e 's/"//'g

Uafprøvet (linjer med #v± hører ikke med):

#v+
#!/bin/sh

KATE="kate -u -l1"

awk '$1 == "include" { print $2 }' "${1}" \
| tr -d \" \
| while read FILENAME
do
grep -q "${2}" "${FILENAME}" && {
${KATE} "${FILENAME}" || :
}
done

:
# eof
#v-

NB: $1 og $2 i awk-kommandoen har ikke noget at gøre med de til-
svarende shell-variable.

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 13:14

Klaus Alexander Seistrup wrote:
>
> Uafprøvet (linjer med #v± hører ikke med):
>
> #v+
> #!/bin/sh
>
> KATE="kate -u -l1"
>
> awk '$1 == "include" { print $2 }' "${1}" \
> | tr -d \" \
> | while read FILENAME
> do
> grep -q "${2}" "${FILENAME}" && {
> ${KATE} "${FILENAME}" || :
> }
> done
>
> :
> # eof
> #v-
>
> NB: $1 og $2 i awk-kommandoen har ikke noget at gøre med de til-
> svarende shell-variable.
>
> Mvh,
>

Hej Jeg hader når jeg ikke forstår helt hvad der sker og specielt når
der ikke sker noget

jeg har fået denne linje til at virke

awk '$1 == "include" { print $2 }' $1 | tr -d \"

men resten ....

Produktet af den første linje skal vel gemmes i nogle variabler til senere
brug !! men hvordan, er ikke lige ekspert, heller ikke awk.

/carsten


Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 13:37

Carsten skrev:

>> #!/bin/sh
>>
>> KATE="kate -u -l1"
>>
>> awk '$1 == "include" { print $2 }' "${1}" \
>> | tr -d \" \
>> | while read FILENAME
>> do
>> grep -q "${2}" "${FILENAME}" && {
>> ${KATE} "${FILENAME}" || :
>> }
>> done
>>
>> :
>> # eof
>
> Hej Jeg hader når jeg ikke forstår helt hvad der sker

Det kan man jo gøre noget ved.

> og specielt når der ikke sker noget

Det kan man osse gøre noget ved.

> jeg har fået denne linje til at virke
>
> awk '$1 == "include" { print $2 }' $1 | tr -d \"
>
> men resten ....

Du må være lidt mere specifik, hvis vi skal kunne hjælpe dig.

> Produktet af den første linje skal vel gemmes i nogle
> variabler til senere brug !!

Det er da muligt at det sidste "${2}" skulle have været i en variabel
fra starten af. Lad os se på detaljerne.

#v+
1 #!/bin/sh
2
3 KATE="kate -u -l1"
4
5 awk '$1 == "include" { print $2 }' "${1}" \
6 | tr -d \" \
7 | while read FILENAME
8 do
9 grep -q "${2}" "${FILENAME}" && {
10 ${KATE} "${FILENAME}" || :
11 }
12 done
13
14 :
#v-

Forklaring:

1 Jeg vil gerne bruge /bin/sh som shell
2 Tom linje
3 Variabel så jeg hurtigt kan ændre kates kommandolinje
4 En anden tom linje
5 Hvis første ord i filen er "include", så skriv andet ord
6 Fjern alle anførselstegn
7 Indlæs en linje ad gangen i variablen FILENAME
8 For hver linje, gør
9 Grep efter mønstret "${2}" i "${FILENAME}"
10 Hvis mønstret fandtes, så kør kate
11 Slut på blok startet i linje 9
12 Slut på gør-løkke
13 En tredje tom linje
14 Sæt scriptets exit-status til 0 (== succes)

Prøv evt. at ændre scriptet således:

#v+
#!/bin/sh

SOURCEFILE="${1}"
PATTERN="${2}"

KATE="kate -u -l1"

awk '$1 == "include" { print $2 }' "${SOURCEFILE}" \
| tr -d \" \
| while read FILENAME
do
grep -q "${PATTERN}" "${FILENAME}" && {
${KATE} "${FILENAME}" || :
}
done

:
#v-

Du ku' osse prøve at sætte KATE="echo", så det formodede filnavn
til kate blot blive skrevet i en CLI.

Hvad er det præcis for et ord eller mønster du gerne vil finde?
Er der evt. nogle tegn i som grep eller shell'en laver om undervejs?

Har du prøvet at kalde scriptet manuelt med '' omkring de to argumenter:

$ mitscript 'filnavn' 'finddetteord'

?

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 14:47

jeg har lige opdaget at der i filen hvor filnavnene bliver fisket ud af
altid er CR eller LF efter filnavn da det er det sidsta der står på linjen
hvordan får jeg det slettet
/Carsten

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 14:58

En andel lille detalge.
jeg har set at enten grep eller sed kunde oplyse hvilken linje et ord blev
fundet i, dette linje nr skulle så kunde bruges i KATE så filen bliver
åbnet i den linje hvor man fandt det man søgte

/Carsten


Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 15:15

Carsten skrev:

> En andel lille detalge.
> jeg har set at enten grep eller sed kunde oplyse hvilken
> linje et ord blev fundet i, [...]

Hvor så du det henne?

$ man grep

> dette linje nr skulle så kunde bruges i KATE så filen
> bliver åbnet i den linje hvor man fandt det man søgte

Det lyder som en mulighed.

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 15:23

Klaus Alexander Seistrup wrote:

> Carsten skrev:
>
>> En andel lille detalge.
>> jeg har set at enten grep eller sed kunde oplyse hvilken
>> linje et ord blev fundet i, [...]
>
> Hvor så du det henne?
>
> $ man grep

grep -n søg file

\Carsten


Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 15:30

Carsten skrev:

> grep -n søg file

Bingo! Så er resten jo lige ud ad landevejen.

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 15:48

Klaus Alexander Seistrup wrote:

> Carsten skrev:
>
>> grep -n søg file
>
> Bingo! Så er resten jo lige ud ad landevejen.
>
> Mvh,
>
LOL ja det kan du sagtens sige
der er : efter tallet f.eks. 34: og hvordan fisker man lige tallet
og får det puttet ind i kate -u -l <-her
/Carsten




Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 15:58

Carsten skrev:

> der er : efter tallet f.eks. 34: og hvordan fisker man lige
> tallet og får det puttet ind i kate -u -l <-her

Jeg ville nok bruge en kombination af 'read' og 'tr' ('help read'
og 'man tr'). Sammenlign evt. med hvordan (1) der blev fjernet
gåseøjne tidligere i scriptet, og (2) hvorledes man læser en linje
ind i en eller flere variable.

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 17:11

Hej Klaus
jeg har fået følgende brokket sammen men som du sikkert kan gætte virker
det ikke
ned til linjen med |tr -d [:punct:][:alpha:] \
virker det, men så hopper kæden af
/Carsten


#!/bin/sh

oldIFS="${IFS}"
IFS="${IFS}$(printf '\r')"

SOURCEFILE="${1}"
PATTERN="${2}"

KATE="kate -u -l1"

awk '$1 == "include" { print $2 }' "${SOURCEFILE}" \
| tr -d \" \
| while read FILENAME
do
grep -n -w -e ^"${PATTERN}" "${FILENAME}" \
|tr -d [:punct:][:alpha:] \
| while read LINE
do
kate -u -l"${LINE}" "${FILENAME}" ||
done
done

Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 17:26

Carsten skrev:

> jeg har fået følgende brokket sammen men som du sikkert
> kan gætte virker det ikke
> ned til linjen med |tr -d [:punct:][:alpha:] \
> virker det, men så hopper kæden af

Prøv at forklare mig med ord hvad "| tr -d [:punct:][:alpha:]" gør.

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 17:33

Klaus Alexander Seistrup wrote:

> Carsten skrev:
>
>> jeg har fået følgende brokket sammen men som du sikkert
>> kan gætte virker det ikke
>> ned til linjen med |tr -d [:punct:][:alpha:] \
>> virker det, men så hopper kæden af
>
> Prøv at forklare mig med ord hvad "| tr -d [:punct:][:alpha:]" gør.
>
> Mvh,
>
grep -n -w -e ^"${PATTERN}" "${FILENAME}" \ kommer med et resultat der kan
se således ud 34:DSPresence
hvis det var DSPresence jeg valgte at søge på
"| tr -d [:punct:][:alpha:]" fjerner alle tegnsætningstegn & bogstaver så
der kun er 34 tilbage

/Carsten

Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 17:46

Carsten skrev:

> grep -n -w -e ^"${PATTERN}" "${FILENAME}" \ kommer med et
> resultat der kan se således ud 34:DSPresence
> hvis det var DSPresence jeg valgte at søge på
> "| tr -d [:punct:][:alpha:]" fjerner alle tegnsætningstegn
> & bogstaver så der kun er 34 tilbage

Jeg ville nok snarere vælge at lave ':' om til et mellemrum, og så
lade read tage sig af resten:

#v+
| tr ':' ' ' \
| while read LINE DUMMY
do
echo "Dette smider vi ud: DUMMY=${DUMMY}"
echo "LINE=${LINE}, FILENAME=${FILENAME}"
done
#v-

Ser det brugbart ud?

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 19:13

Klaus Alexander Seistrup wrote:

>
> #v+
> | tr ':' ' ' \
> | while read LINE DUMMY
> do
> echo "Dette smider vi ud: DUMMY=${DUMMY}"
> echo "LINE=${LINE}, FILENAME=${FILENAME}"
> done
> #v-
>
> Ser det brugbart ud?
>
> Mvh,
>
Ser meget fornuftigt ud, det var bare ikke lige der mit problem var
men i denne linje, har jeg lige opdaget
kate -u -l"${LINE}" "${FILENAME}" ||
som lige skulle barberes ned til
kate -u -l"${LINE}" "${FILENAME}"
og så virker det som jeg havde forestilletmig
vi er sk.. et bar dygtige svende
Tak for hjælpen
/Carsten

og så ende det med at se sådan ud

#!/bin/sh

oldIFS="${IFS}"
IFS="${IFS}$(printf '\r')"

SOURCEFILE="${1}"
PATTERN="${2}"

awk '$1 == "include" { print $2 }' "${SOURCEFILE}" \
| tr -d \" \
| while read FILENAME
do
echo "FILENAME=${FILENAME}, PATTERN=${PATTERN}"
grep -n -e^"${PATTERN}" "${FILENAME}" \
|tr -d [:punct:][:alpha:] \
| while read LINE
do
kate -u -l"${LINE}" "${FILENAME}"
done
done


Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 19:30

Carsten skrev:

> men i denne linje, har jeg lige opdaget
> kate -u -l"${LINE}" "${FILENAME}" ||
> som lige skulle barberes ned til
> kate -u -l"${LINE}" "${FILENAME}"
> og så virker det som jeg havde forestilletmig

Hvis du ændrer det til

   kate -u -l"${LINE}" "${FILENAME}" || :

(altså som det var fra starten med kolon efter de to lodrette streger),
slipper du for at scriptet hopper ud af løkken hvis kate returnerer
andet end 0.

> vi er sk.. et bar dygtige svende

Det' jo dét!

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 21:45

så løb jeg panden mod muren igen
De filer jeg arbejder med, er dos relaterede,
derfor er stinavnet med \ og ikke / som i unix, eks.
include "\udvik\pic\util\p16f84.inc"
det er fordi jeg bruger en compiler der bliver kørt under dosemu,
det er ikke lykkedes mig at finde en unix/linux compiler der er 100%
kompatibel,
der er lykkedes at vende \ til /, men som du sikker kan se mangler det
første af stien, /home/carsten, det har aldrig været der, men for at
filerne kan åbnes med kate skal der være fuld stinavn.
dog ikke når include "wait.mac" da denne fil ligger i det bibliotek
hvori der arbejdes


/udvik/pic/util/p16f84.inc skal blive til
/home/carsten/udvik/pic/util/p16f84.inc"
og
wait.mac skal forblive wait.mac

min ide var at finde den første / og erstatte den med /home/carsten/

hvilken kommando
/Carsten



Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 22:16

Carsten skrev:

> /udvik/pic/util/p16f84.inc skal blive til
> /home/carsten/udvik/pic/util/p16f84.inc"
> og wait.mac skal forblive wait.mac
>
> min ide var at finde den første / og erstatte den med /home/carsten/

Hvis du kører scriptet som dig selv, kan du sætte '~' foran stien,
hvis du kører scriptet som en anden bruger, kan du sætte '~carsten'
foran stien.

Prøv fx:

#v+
   $ STI='/udvik/pic/util/p16f84.inc'
   $ eval echo "~$STI"
#v-

Jeg vil overlade til dig selv at skrive en if-block der tager højde
for filen wait.mac.

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 22:28

Jeg skrev:

>    $ STI='/udvik/pic/util/p16f84.inc'
>    $ eval echo "~$STI"

Man kan selvfølgelig osse bare:

#v+
   $ STI='/udvik/pic/util/p16f84.inc'
   $ echo "${HOME}${STI}"
#v-

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (07-02-2008)
Kommentar
Fra : carsten


Dato : 07-02-08 23:58

jer er fa.. ved at få grå hård, det første eksempel virker
men eks #2 gør ikke, ${NYSTI} bliver godtnok /home/carsten/osv.
men det går galt i grep som på besynderlig vis ikke kommer i funktion !
/Carsten


eks #1
| while read FILENAME
do
grep -n -i -e^"${PATTERN}" "/home/carsten${FILENAME}" \


eks #2
| while read FILENAME
do
echo ${NYSTI:="/home/carsten${FILENAME}"}
echo "NYSTI=${NYSTI}, PATTERN=${PATTERN}"
grep -n -i -e^"${PATTERN}" "${NYSTI}" \




Klaus Alexander Seis~ (08-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 08-02-08 06:50

Carsten skrev:

> eks #2
>| while read FILENAME
> do
> echo ${NYSTI:="/home/carsten${FILENAME}"}
> echo "NYSTI=${NYSTI}, PATTERN=${PATTERN}"
> grep -n -i -e^"${PATTERN}" "${NYSTI}" \

Man kan ikke echo'e og tildele på én gang - i hvert fald ikke på
den måde. Så tildel NYSTI en værdi på en linje for sig selv.

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

carsten (08-02-2008)
Kommentar
Fra : carsten


Dato : 08-02-08 10:33

Klaus Alexander Seistrup wrote:

> Carsten skrev:
>
>> eks #2
>>| while read FILENAME
>> do
>> echo ${NYSTI:="/home/carsten${FILENAME}"}
>> echo "NYSTI=${NYSTI}, PATTERN=${PATTERN}"
>> grep -n -i -e^"${PATTERN}" "${NYSTI}" \
>
> Man kan ikke echo'e og tildele på én gang - i hvert fald ikke på
> den måde. Så tildel NYSTI en værdi på en linje for sig selv.
>
> Mvh,

Du må være ved at være gråhåret efterhånden, over at hjælpe sådan et fjols
som mig
Jeg har prøvet alverdens forskellige kombinationer, men det er mig komplet
umuligt at få det til at virke og i nogle situationer gror FILENAME fast
d.v.s. at den ikke ændre sig ;-(
snøft Carsten



carsten (08-02-2008)
Kommentar
Fra : carsten


Dato : 08-02-08 10:59

carsten wrote:

> Klaus Alexander Seistrup wrote:
>
>> Carsten skrev:
>>
>>> eks #2
>>>| while read FILENAME
>>> do
>>> echo ${NYSTI:="/home/carsten${FILENAME}"}
>>> echo "NYSTI=${NYSTI}, PATTERN=${PATTERN}"
>>> grep -n -i -e^"${PATTERN}" "${NYSTI}" \
>>
>> Man kan ikke echo'e og tildele på én gang - i hvert fald ikke på
>> den måde. Så tildel NYSTI en værdi på en linje for sig selv.
>>
>> Mvh,
>
> Du må være ved at være gråhåret efterhånden, over at hjælpe sådan et fjols
> som mig
> Jeg har prøvet alverdens forskellige kombinationer, men det er mig komplet
> umuligt at få det til at virke og i nogle situationer gror FILENAME fast
> d.v.s. at den ikke ændre sig ;-(
> snøft Carsten

Jeg havde åbenbart ikke prøvet alle kombinationer
NYSTI="/home/carsten${FILENAME}"

Carsten


Klaus Alexander Seis~ (08-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 08-02-08 11:51

Carsten skrev:

> Jeg havde åbenbart ikke prøvet alle kombinationer
> NYSTI="/home/carsten${FILENAME}"

Det var det jeg mente med »[at tildele] NYSTI en værdi på en
linje for sig selv.«

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

Klaus Alexander Seis~ (08-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 08-02-08 11:52

Carsten skrev:

> Du må være ved at være gråhåret efterhånden, over at hjælpe
> sådan et fjols som mig

Forhåbentlig lærer du noget undervejs, og så er tiden vel ikke
givet så dårligt ud endda.

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

Klaus Alexander Seis~ (07-02-2008)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 07-02-08 15:12

Carsten skrev:

> jeg har lige opdaget at der i filen hvor filnavnene bliver
> fisket ud af altid er CR eller LF efter filnavn da det er
> det sidsta der står på linjen hvordan får jeg det slettet

$ man tr

Fx for at slette et CR:

$ tr -d '\r' <medCR.txt >udenCR.txt

eller for at lave alle CR'er om til LF'er:

$ tr '\r' '\n' <medCR.txt >medLF.txt

Normalt er LF ikke et problem, idet variablen IFS [sædvanligvis] inde-
holder <SPACE><TAB><LF>. I stedet for at bøvle med tr(1), kan man til-
føje CR til $IFS inden man kører scriptet. Fx noget i retning af

#v+
#!/bin/sh
oldIFS="${IFS}"
IFS="${IFS}$(printf '\r')"

: [det originale script kommer her]

IFS="${oldIFS}"
# eof
#v-

Man kan sikkert lave CR'er på en masse andre måder end "printf '\r'",
så tag hvad du kan lide.

Mvh,

--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408195
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste