[ LØST ] iriterende regex problem med newline

dudsen
Antal: 963
Tilmeldt:
10-01-2009
User is offline
[ LØST ] iriterende regex problem med newline

Jeg er løbet ind i et problem med regex det jeg vil er at erstate newline med \| for at kunne fodre output til grep, mit problem er at både perl og tr ser ud til at matche "end of line" og ikke bare linjeskift ie jeg vil ikke have strengen afsluttet med "\|"

udsen@ubmain:~$ cat testfile2
1234
5678
8910
udsen@ubmain:~$ perl -pe 's/\R/\\\|/g' testfile2 ; echo ""
1234\|5678\|8910\|
udsen@ubmain:~$ tr '\n' ';' < testfile2 ; echo ""
1234;5678;8910;

jeg har forsøgt med \R i stedet for \n og med samme resultat. Er der et eller andet åbentlyst jeg har glemt.
En note her er at hvis jeg opretter filen under windows(notepad+ med unix line endings) så er der ikke en EOL karakter i slutningen af filen og dermed virker det.
Jeg har et woraround med et regex der fjerner den sidste "\|" men vil egentligt heller at kunne gøre det i en regex streng.


mich
mich's picture
Antal: 953
Tilmeldt:
13-10-2007
User is offline
Du giver næsten selv

#0:

Du giver næsten selv svaret. Prøv med
tr '\n' '|' < testfile2 ; echo ""

./mich


dudsen
Antal: 963
Tilmeldt:
10-01-2009
User is offline
Du giver næsten selv

#1:
Du giver næsten selv svaret. Prøv med
tr '\n' '|' < testfile2 ; echo ""

Den matcher stadigvæk EOL og ikke kun newline men fejlen kan værre i filen, jeg har forsøgt at oprette en fil både med echo "number" >> filnavn og vim og der er samme adfærd.'

"fejlen" hvis det er en fejl og ikke bare et problem med min forståelse af regex er at resultater er
"1234\|5678\|9012\|" istedet for ""1234\|5678\|9012"

"\|" konstruktionen er med vilje her fordi min grep ellers opfatter | som | og ikke "eller".


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
Her i arbejdstiden bliver

Her i arbejdstiden bliver det uden nærmere forklaringer, men dem er du formodentlig også i stand til selv at slå op:)

perl -0777 -pe 's/\n/\\|/g' testfile


dudsen
Antal: 963
Tilmeldt:
10-01-2009
User is offline
perl -0777 -pe

#3:
perl -0777 -pe 's/\n/\\|/g' testfile

Slurp giver samme resultat

~$ perl -0777 -pe 's/\n/\\|/g' testfile3 ; echo ""
1234\|5678\|9012\|

Jeg kan dog med \z matche den sidste linie. Jeg har iøvrigt fået læst op på hvordan unix filer er bygget op og er kommet frem til at problemet realt er min forståelse, der er ingen forskel på EOF(filafslutning) og linieskift ie det jeg forsøger er nok ikke realt muligt men tak for hjælpen folkens.


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
#4Det virker umiddelbart

#4

Det virker umiddelbart hos mig

$ cat testfile
1234
5678
8910
8910

Der er ingen linjeskift til sidst (jeg måtte lave filen i emacs, for 'vi' ville indsætte linjeskift:
$ hexdump -c testfile
0000000 1 2 3 4 \n 5 6 7 8 \n 8 9 1 0 \n 8
0000010 9 1 0
0000013

$ perl -0777 -pe 's/\n/\\|/g' testfile
1234\|5678\|8910\|8910


dudsen
Antal: 963
Tilmeldt:
10-01-2009
User is offline
[ LØST ] filformat

#5: Der er ingen linjeskift til sidst (jeg måtte lave filen i emacs, for 'vi' ville indsætte linjeskift:

Kom frem til det samme standard adfærd er altid at sætte et linie skift ind i slutningen af en fil hvis det ikke er der så virker mit oprindelige regex hvis den er der så gør det ikke. hovedproblemet va at jeg fodrede perl med en fil der ikke så ud som jeg forventede.

$ hexdump -c testfile3
0000000 1 2 3 4 \n 5 6 7 8 \n 9 0 1 2 \n
000000f
$ hexdump -c data/tmp/testfile3
0000000 1 2 3 4 \n 5 6 7 8 \n 9 0 1 2
000000e

den første er med den sidste linie fjernet. Så jeg er nødt til at rense input først
$ perl -pe 'chomp if eof' testfile3 | perl -pe 's/\n/\\\|/g' ; echo ""
1234\|5678\|9012

Takker mange gange for hjælpen.