• Reset your password

User account menu

  • Artikler
  • Forside
  • Forum
  • Nyheder
  • Log in
Hjem
Linuxin 2025

Breadcrumb

  • Hjem
  • forums
  • [ LØST ] iriterende regex problem med newline

Hvad kan du med 100% sikkerhed sige, at du har stemt?

Resultater

1
0% (0 stemmer)
2
0% (0 stemmer)
Schrödinger
100% (1 stemme)
Antal stemmer: 1
Af dudsen | 07.03.2014 10:10

[ LØST ] iriterende regex problem med newline

Programmering

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.


  • Log in to post comments

Kommentarer6

11 år 2 måneder siden

Permalink

Indsendt af mich den 7. marts 2014 kl. 11:15

Permalink

Du giver næsten selv

#0:



Du giver næsten selv svaret. Prøv med

tr '\n' '|' < testfile2 ; echo ""

  • Log in to post comments

11 år 2 måneder siden

Permalink

Indsendt af dudsen den 7. marts 2014 kl. 11:38

Permalink

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

  • Log in to post comments

11 år 2 måneder siden

Permalink

Indsendt af mrbrown79 den 7. marts 2014 kl. 13:02

Permalink

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

  • Log in to post comments

11 år 2 måneder siden

Permalink

Indsendt af dudsen den 7. marts 2014 kl. 13:59

Permalink

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.

  • Log in to post comments

11 år 2 måneder siden

Permalink

Indsendt af mrbrown79 den 7. marts 2014 kl. 14:10

Permalink

#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


  • Log in to post comments

11 år 2 måneder siden

Permalink

Indsendt af dudsen den 7. marts 2014 kl. 14:56

Permalink

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

  • Log in to post comments

Svar søges

2 stk Jolla C2 sælges 0
Den er go 0
Vil du have et sikrere og mere privat internet? Du skal blot installere Vivaldi-browseren med Proton VPN understøttelse! 0
14. februar = I Love Free Software Day 0
Lokal fil-deling - for de dovne. 0

Seneste aktivitet

Det første forumindlæg efter installation af Forum-modulet 8
Test 1
Vanilla OS 12
Nye forum-indlæg viser sig kun 1 gang 1
Vil alle forumindlæg vise sig to gange 1
Hjælp til remote terminal vindue? 3
PCLinuxOS 19
Kan ikke boote på installation 24
80-20 reglen 1
Skærmlys fader ud på min bærbare 8
32 bit distro på max 700mb der stadig understøttes 26
Har vi nogen Linux konsulenter i Slagelse området? 3
Virkelig 7
gnome-software? 3
Archer T2U AC600 Wireless Dual Band USB Adapter 26
En farverig APT 3.0 udgivelse imponerer med sine nye funktioner 2
Unix's fødsel 2
Linux Mint 13
"Intet realistisk alternativ" - mig i r*ven 1
German state moving 30,000 PCs to LibreOffice 6

Copyright © 2025 Company Name - All rights reserved

Developed & Designed by Alaa Haddad