Cmd-scipti etsimiseen ja korvaamiseen tiedoston sisällä

Liittynyt
26.11.2019
Viestejä
81
Pitäisi tosiaan tehdä .cmd tiedosto, jolla etsiä ja korvata tietoja tekstitiedoston sisältä. Nyt tällä hetkellä mulla on seuraavanlainen scripti:

@echo off &setlocal

set "search=matti"

set "replace=teppo"

set "textfile=xxxxx.txt"

set "newfile=xxxx.txt"

(for /f "delims=" %%i in (%textfile%) do (

set "line=%%i"

setlocal enabledelayedexpansion

set "line=!line:%search%=%replace%!"

echo(!line!

endlocal

))>"%newfile%"

del %textfile%

rename %newfile% %textfile%

pause
Haluaisin saada tuon sciptin etsimään ja korvaamaan useita eri kohteita (etsiä kalle, jouni ja korvata ne sami, veeti) samasta tiedostosta ja vielä uloskirjoittamaan tiedoston eri nimellä kuin alkuperäinen. Sekä saada tuon scriptin lukemaan kaikki tekstitiedostot siinä kansiossa jossa tuo scipti on, ettei tarvitse aina käydä muuttamassa tuota "set=textfile..." jos sellainen vaan on mahdollista.

Onnistuuko tuollainen jotenkin helposti?
 
Liittynyt
17.10.2016
Viestejä
522
Tähän on varmaan about miljoona erilaista tapaa, itse tekisin Powershellillä.

Esim. alkup. tekstitiedosto, joita kansiossa useampana kopiona:

The quick brown fox jumped over the lazy dog
The quick white fox jumped over the lazy dog
The quick black fox jumped over the lazy dog
The quick red fox jumped over the lazy dog


Powershell:

Koodi:
$Path = "C:\demo"
$Files = Get-ChildItem -Path $Path

Foreach ($File in $Files) {
    $NewFile = "New_" + "$File"
    $FileContent = Get-Content -Path $Path\$File -Raw
    $FileContent.replace("brown", "golden").replace("lazy","crazy") | Set-Content -Path "$Path\$NewFile" -Force
}

Lopputulos: yhtä monta tekstitiedostoa samassa polussa New_ -etuliitteellä alla olevalla sisällöllä:

The quick golden fox jumped over the crazy dog
The quick white fox jumped over the crazy dog
The quick black fox jumped over the crazy dog
The quick red fox jumped over the crazy dog
 
Liittynyt
26.11.2019
Viestejä
81
Tuolla powershellillähän tuo onnistui melkoisen helposti. Ongelmakseni muodostui nyt seuraavanlainen: tällä hetkellä tuo scripti korvaa kaikki tekstistä löytyvät vastaavuudet. Tuossa pitää vissiin jumpata tuon substring-komennon kanssa jos haluan saada korvattua vain tietyltä osalta riviä vastaavuudet ja jättää seuraavat sillä samaisella rivillä olevat vastaavuudet korjaamatta. Varmaan helpoin tapa esittää tämä on esimerkin kautta:
matti ukonpoika ja matti iivari olivat kalassa
kalle ja hänen veljensä kustaa kalle liittyivät seuraan
jounin ja jounin veljenpojan avustuksella.
Ja tuosta yllämainitusta tiedostosta haluaisin seuraavanlaisen:
teppo ukonpoika ja matti iivari olivat kalassa
sami ja hänen veljensä kustaa kalle liittyivät seuraan
veetin ja jounin veljenpojan avustuksella.
Eli haluan saada vaihdettua vain ensimmäisten viiden merkin aikana per rivi tuota nimeä ja aina siis samalla kohdalla tiedostoa. Sen verran yritin katsella että tuolla Substring-komennolla pystyy poimimaan ja replace komennon avulla sitten muuttamaan tuolta (0,5) väliltä noita nimiä. Kuitenkaan tulosteeseen en saa kuin tuon ylimmän rivin tulostumaan. Johtuuko se siitä, että käyttää tuota -raw komentoa, onko jotain komentoa joka säilyttää rivit jolloin pystyn tulostamaan kaikki kolme riviä?
 
Liittynyt
17.10.2016
Viestejä
522
Tällaisen alkuperäisen tekstin

Koodi:
esa ukonpoika ja esa iivari olivat kalassa
kalle ja hänen veljensä kustaa kalle liittyivät seuraan
valtteri-irmelin ja valtteri-irmelin veljenpojan avustuksella.
saa muokattua tällaiseksi

Koodi:
vesa ukonpoika ja esa iivari olivat kalassa
sami ja hänen veljensä kustaa kalle liittyivät seuraan
veetin ja valtteri-irmelin veljenpojan avustuksella.
käyttäen tällaista skriptipätkää

Koodi:
$Path = "C:\demo"
$Files = Get-ChildItem -Path $Path

Foreach ($File in $Files) {
    $FileContent = Get-Content -Path $Path\$File
    $Counter = 0
   
    Foreach ($Line in $FileContent) {
        $Line = $Line -split " ",2
        $Line[0] = $Line[0].replace("esa","vesa").replace("kalle","sami").replace("valtteri-irmelin","veetin")  
        $FileContent[$Counter] = $Line[0] + " " + $Line[1]
        $Counter++
    }
   
    $NewFile = "New_" + "$File"
    Set-Content -Path "$Path\$NewFile" -Value $FileContent -Force
}
Tuo esimerkki siis pätkäisee jokaisen rivin ensimmäisen sanan erilleen (katkaisu tehdään ensimmäisen whitespacen kohdalta) ja korvaus kohdistetaan vain siihen. Muilta osin toimii kuten edellinen. Eilisessä yritelmässäni käytetty -Raw optio lukee koko tiedoston sisällön yhteen merkkijonoon, ilman sitä se pilkkoo tiedoston rivit taulukkoon.
 
Toggle Sidebar

Statistiikka

Viestiketjut
186 136
Viestejä
3 388 001
Jäsenet
60 719
Uusin jäsen
greta

Hinta.fi

Ylös Bottom