Kirjoittaja Aihe: regexp apuja tarvis ;(  (Luettu 1150 kertaa)

jekku

  • Käyttäjä
  • Viestejä: 2378
    • Profiili
regexp apuja tarvis ;(
« : 01.01.13 - klo:02.34 »
Noinkin simppeli kuvio hukassa:'
Pitäisi poistaa yksittäiset tyhjät rivit

Minulla on hervottomsan pitkä tekstifile josta pitäisi siivota sellaiset rivit poois joissa vain spaceja ja seuraavalla rivillä kirjaimia.

Siis kaksi peräkkäistä whitespaceja sisältävää riviä pitäisi jättää kodskemattoamaksi mutta vain yksittäiset 'tyhjät' poidstettava.

Ja ei palaa mieleen miten se on tehtävissä!
(Tiedän, että on - ja olen joskus tehnytkin)



Jiku

  • Käyttäjä
  • Viestejä: 246
    • Profiili
Vs: regexp apuja tarvis ;(
« Vastaus #1 : 01.01.13 - klo:05.56 »
Ymmärsinkö oikein, että kaksi välilyöntiä ja sen jälkeen kirjaimia sisältävät rivit jätetään ja kaikki muut poistetaan?

tyhjat.txt:
Koodia: [Valitse]
  tämä jätetään
tämä poistetaan
 tämäkin poistetaan
  tämä jätetään


yllä olevat tyhjät rivit ja tämä rivi poistetaan
tätä  ei jätetä

Koodia: [Valitse]
cat tyhjat.txt |grep '^\ \ [a-z]'
Puoliksi suunniteltu on hyvin tehty

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3392
    • Profiili
Vs: regexp apuja tarvis ;(
« Vastaus #2 : 01.01.13 - klo:14.31 »
Lainaus
Siis kaksi peräkkäistä whitespaceja sisältävää riviä pitäisi jättää kodskemattoamaksi mutta vain yksittäiset 'tyhjät' poidstettava.
Tuo on aika klassinen "hankala" tehtävä "sed": lle.  Annan vinkin mutta jätän onnistumisen riemun sinulle.  Tuohon on pari eri tapaa mutta helppo tapa on kiertää ongelma, korvataan "LF" jollain helpommalla merkillä (sed: in kannalta), se etsintäsääntö sitten on:  Etsi kaksi "LF" merkkiä jonka edessä tai perässä ei ole "LF".  Tuossa siis se "LF" on nyt jokin helpompi merkki.  Palautetaan "LF" alkuperäiseksi.  "tr" vaihtaa kätevästi merkin toiseksi.

Edit:  Mielessäni heräsi vielä kysymys onko kyseessä tilanne kaksi peräkkäistä

<LF> <LF>   kuten oletin vai
<LF> <"jotain_muuta_valkoista"><LF>  ?

Vai tarkoititko jotain aivan muuta ?  "Tyhjä rivi" voi tarkoittaa hyvin monta eri asiaa/kombinaatiota.

Aito mallidatan pätkä auttaisi näkemään mitä se tarkasti ottaen on.  Voisitko laittaa pätkän dataa privana tulemaan ellet halua esille, kirjoittelen sille säännön.


Edit_2:
Annan esimerkin tapauksessa että tuo yksi tyhjä rivi on rakenteeltaan yksinkertaisesti
<LF><LF>

Oletetaan että meillä on koetiedosto "koe.txt" jolla testataan toimintaa.  Tässä on lause joka tiputtaa vain yksinäisen tyhjän rivin tuosta tiedostosta:

Koodia: [Valitse]
cat koe.txt | tr '\n' '|' | sed 's/\([^|]\)\(||\)\([^|]\)/\1|\3/g' | tr '|' '\n' >koe2.txt
mutta jättää useamman tyhjän rivin koskemattomaksi ja kirjoittaa tuloksen koe2.txt tiedostoon.
Jos tuo yksinkertainen versio ei tee mitä haluat niin siihen pystyy täydentämään puutteet säännössä. Sääntö käyttää tilapäisenä merkkinä palkkia "|" eli putkimerkkiä.  Tuo ei saa esiintyä varsinaisessa tekstissä.  

Selitys:
Jokainen <LF> merkki korvataan ensin palkilla "|". Sääntö on jaettu kolmeen osaan suluilla ()()() mutta nuo pitää sed: in tapauksessa "eskeipata" eli laittaa kenoviiva kunkin sulkumerkin eteen.   Näihin suluilla merkittyihin alueisiin voidaan viitata merkinnöillä "\1 \2 \3".   Merkintä "\1" siis palauttaa osuma-alueen 1,  "\2" osuma-alueen 2, jne.   Etsimme nyt osumaa tilanteessa missä on kaksi ja vain kaksi palkkia peräkkäin.   Sääntönä tuon joutuu muotoilemaan:

    <ei_palkki> <||> <ei_palkki>

mikä vastaa sitä yhtä tyhjää riviä eli alkuaan <LF><LF>.
Säännössä tarvitaan nuo "esteet" että vältetään osuma kun palkkeja on enemmän kuin kaksi peräkkäin.
 
« Viimeksi muokattu: 02.01.13 - klo:14.49 kirjoittanut ajaaskel »
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.