'sed' kérdés

Fórumok

Adott néhány (jó sok) fájl, a ":" kéne átírni benne "_"-ra:

wrfout_d03_2017-03-04_12:00:00_post.nc
wrfout_d03_2017-03-05_12:10:00_post.nc
wrfout_d03_2017-03-06_12:20:00_post.nc
wrfout_d03_2017-03-04_12:10:00_post.nc
wrfout_d03_2017-03-05_12:20:00_post.nc
wrfout_d03_2017-03-06_12:30:00_post.nc


#!/bin/sh

# Not working???
for file in `ls -1 wrfout_d03_*_post.nc`; do
  newname=`echo "$file" | sed 's/^(.*):(\d{2}):(.*)/$1_$2_$3/'`
  ## mv "$file" "$newname"
  echo "$file --> $newname"
done

A segítséget előre is köszönöm.

Hozzászólások

Debian / Ubuntu esetében van rename parancs, pont erre a célra:

rename -v 's/:/_/g' *.nc

--
http://eVIR.hu
Elektronikus Vállalatirányítási Információs Rendszer

Ha patternt adsz meg, akkor tegyed pontosan: A 12:10:00 közepén nem két digit, hanem egy 0-5 és egy 0-9 digitből áll. A (.*) itt elég semmitmondó, elhagyható.

sed 's/:\([0-5][0-9]\):/_\1_/'

"A 12:10:00 közepén nem két digit, hanem egy 0-5 és egy 0-9 digitből áll."

En megkerdojeleznem a relevanciajat ebben a kontextusban, majd kesobb lehet, hogy valaki vakarja majd a fejet, hogy vajon tenyleg letezhet olyan input, amelyben ott nem 0-5 es 0-9 lesz es azt szandekosan ugorjuk-e at. Ha nem muszaj, en nem torodnek a szamok szemantikajaval, feleslegesen nem specifikalnam tul a modositast.

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám

bash-ban is van ilyesmi:


#!/bin/bash
for i in *:*; do
    echo "$i -> ${i//:/_}"
done

Hű... ha a script-rondasági versenyen indulnál, elég sok területen sikerülne a citromdíjat megnyerni evvel a scripttel!

for file in `ls -1 wrfout_d03_*_post.nc`; do

Ez akkora facepalm, hogy megérdemelné a... mondjuk az összes star-trek-es facepalm idelinkelését, annyi sebből vérzik.

Kezdve avval, hogy "spéci" fájlneveken hányféleképp vérezhet el, még tetézi a helyzetet, hogy forkolsz is mellé.
Minek használod a shell képességeit, ha csak "vezérlésre" használod?

for file in wrfout_d03_*_post.nc ; do
-val pl. mi bajod volt, hogy nem azt írtad? Tiszta, egyértelmű, könnyebb olvasni, és nem vérzik ezer sebből?
A KISS-ről már hallottál?
Szóval a teljes megoldás:
Bash-only: (NB.: Teljesen forkmentes, az mv-t leszámítva!)
for file in wrfout_d03_*_post.nc ; do
mv "$file" "${file//:/_}"
done

Posix-portable:
for file in wrfout_d03_*_post.nc ; do
newfile="$(printf "%s" "$file" | tr : _ )"
mv "$file" "$newfile"
done

Javasolt olvasmány még:
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html

De köszi Mindenkinek a segítséget.

find -type f -name "wrfout_d03_*_post.nc" | xargs rename 's/:/_/g'

[szerk:] bocs, elgépeltem, javítottam.

---
"A megoldásra kell koncentrálni nem a problémára."