Sziasztok! Abban szeretném kérni a segítségeteket, hogy adott pár tucat szöveges, file, aminek egy bizonyos sorát egy bizonyos minta alapján szeretném megváltoztatni, majd elmenteni őket új néven. pl. file1.txt és file2.txt ... is tartalmazza a "sarga" szót, amit mindenhol szeretnék "kek"-re változtatni új filenevekkel, amik pl. SargaFie1.txt és SargaFile2.txt stb... lesznek. Aztan majd "zold"-re is és így tovább. Szeretném nem egyesével, szóval elsősorban parancssoros megoldások érdekelnek! Előre is köszönöm ha tudtok segíteni! Sajna lövésem sincs, merre keresgéljek. Üdv: Pali És a MEGOLDÁS: ls piros_*.ly > ls_piros.txt awk 'BEGIN { FS = "_" } ; {print "sed -e 's/piros/kek/g' " $0" > kek_"$2 }' ls_piros.txt >Piros2Kek.sh utána csak futtatni kell e Piros2Kek.sh file-t és bingó Köszönöm mégegyszer a sok segítséget! Pali

Shell scriptet írnék rá, amit nem tudok fejből, nyálaznom kellene a referencia használatiát rendesen hogy eltaláljam a helyes szintaxist. De az alap logika szerintem (aztán majd kijavítanak): 1) beolvasod a fájlt, minden sorát egy array változóba küldöd 2) regex keresést futtatsz a sorokon, ha van találat, akkor azt a sort lecseréled 3) vissza alakítod az array-t stringre, beírod az új fájlba

Kezdenék legózni a sed-del. pl.: sed -e 's/sarga/kek/g' file1.txt >file1kek.txt

    kltHát ez nagyon tuti, egy sor. Már csak meg kell etetni egy halom txtvel és annyi. Jut eszembe valahol azt olvastam nincs olyan feladat amire az AWK ne lenne jó... Ez most már 3 külön út ugyan arra a feladatra.

    • klt válaszolt erre.

      bartasziliJa, ilyen a Lego :) find *.txt | while read -r nev; do sed -e 's/sarga/kek/g' $nev > $nev.kek.txt; done Aztán még ezt is lehet kalapálni, hogy tényleg jó legyen.

      • pnem válaszolt erre.

        kltFantasztikus! Nagyon köszönöm! A sed -es megoldás zseniális! Pont ezt akartam! Sajnos, a while-t nem értem, de attól még működik :) Viszont hogyan oldom meg azt, hogy a file-névben ne legyen csak egy pont? Örök hála! Pali

          a mesterKöszönöm a gyors választ, de valamiért nem megy. :( ha a $ jel után 1-est rakok, akkkor új file-nevet adhatok neki, de a régit nem teszi hozzá :(

            pnemA $nev a régi név. Ha megváltoztatod, akkor nem lesz a régi.

            • pnem válaszolt erre.

              a mesterÉs ha a név bizonyos részeire szükségem lenne, bizonyos részeit pedig változtatnám? pl.: SargaFile1.txt -ből ZoldFile1.txt -t szeretnék?

                pnemAz újabb awk és sed... amit meg fejből én se ütök össze, csak némi gyakorlás árán.

                • pnem válaszolt erre.

                  a mesterNem baj! Akkor is nagyon köszönöm a segítséget! Valakinek biztos menni fog! P

                  pnemPróbálj így hivatkozni rá: ${nev//Sarga/Zold} (Ezt most nem próbáltam ki...)

                  pnem"Sajnos, a while-t nem értem, " Eredetile find -exec {} izébizé alapján próbáltam összehebrákolni, de nem ment a második behelyettesítés. Ezért ciklust rettyintettem, hogy értsd: find *.txt megkeresi a szöveges fájljaidat. a | jel a find kimenetét becsatornázza a másik program bemenetére, ami a ciklus.. while read -r nev; Amíg van mit olvasni a bemenetről, beolvassa a "nev" változóba. Lehetne akármi a neve, én nev-nek neveztem. Innentől $nev a hivatkozás, és az helyettesíti az aktuális fájlnevet, amin dolgozol. do után jön a teendő: do sed -e 's/sarga/kek/g' $nev > $nev.kek.txt; Tehát, ha a nev=Fajl1.txt, akkor a parancs valóságos kinézete: sed -e 's/sarga/kek/g' File1.txt > File1.txt.kek.txt done pedig lezárja a ciklust. Lehet, hogy valami ilyesmire van szükséged: find *.txt | while read -r nev; do sed -e 's/sarga/kek/g' $nev > ${nev//Sarga/Kek}; done (Ezt most még nem próbáltam ki, csak okoskodás...)

                  • pnem válaszolt erre.

                    kltWowww! Nagyon hálásan köszönöm! Különösen a magyarázatot! Pali

                    Ennyivel később: 2 év