script hjälp

Tråden skapades och har fått 8 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • 2004-10-13 17:46

Yo!

behöver lite hjälp med ett script jag håller på med
får följande output ur ett komando

foo-output-1.2.3 foo 2 foo-output2-1.2 foo-output3-1.3 foo-output4-1.4

vill att det ska bli såhär

foo-output.xxx foo-output2.xxx foo-output3.xxx foo-output3.xxx

altså tabort allt bakom sista -, och istället lägga till .xxx

svårt när det inte är i kolumner !
cut awk eller ?

  • Oregistrerad
  • 2004-10-13 18:16

Ett tips: om du vill ha nåt svar så kan du gärna tala om vilket språk du använder sh, python, Perl, etc.

  • Medlem
  • 2004-10-13 18:43
Ursprungligen av Jan Erik Moström:

Ett tips: om du vill ha nåt svar så kan du gärna tala om vilket språk du använder sh, python, Perl, etc.

missade ordet shell innan script :eek:

Kanske det här är en början?

#!/bin/bash

for i in foo*-*-*; do
fn=`echo $i | sed -e 's/\(.*-.*\)-\(.*\)/\1.nnn/g'`
echo $fn;
# mv $i $fn
done;

Stryker allt efter och inkl andra bindestrecket och lägger till .nnn
Måste vid behov ändras för att ta hänsyn till fler än ett bindestreck
före det sista, men det är lite krångligare och hinner inte.

Testa via:
Stoppa allt i en fil. Gör chmod +x på filen.
Testa i en testfolder eller ha backups.

Ta bort echo-raden och bort med # när du känner att det funkar. I nuvarande
skick gör den inga ändringar. Kan säkert förenklas av någon som är duktig.
Använd på egen risk och lycka till!

Senast redigerat 2004-10-15 12:19
  • Medlem
  • 2004-10-14 23:48
Ursprungligen av Axafluff:

#!/bin/bash

for i in foo*-*-*; do
fn=`echo $i | sed -e 's/\(.*-.*\)-\(.*\)/\1.nnn/g'`
echo $fn;
# mv $i $fn
done;

Stryker allt efter och inkl andra bindestrecket och lägger till .nnn
Kanske behöver ändras för sista bindestrecket men det är lite
krångligare och hinner inte.

Testa via:
Stoppa allt i en fil. Gör chmod +x på filen.
Testa i en testfolder eller ha backups.

Ta bort echo-raden och bort med # när du känner att det funkar. I nuvarande
skick gör den inga ändringar. Kan säkert förenklas av någon som är duktig.
Använd på egen risk och lycka till!

Tackar! raden sed -e 's/\(.*-.*\)-\(.*\)/\1.nnn/g'`
är mycket intressant den får scriptet nästan att göra vad jag vill.
men ärligt så fattar jag inte den inte!
så det är bara för mig att läsa på lite mer om sed.

Ursprungligen av love:

Tackar! raden sed -e 's/\(.*-.*\)-\(.*\)/\1.nnn/g'`
är mycket intressant den får scriptet nästan att göra vad jag vill.
men ärligt så fattar jag inte den inte!
så det är bara för mig att läsa på lite mer om sed.

Det som händer är att indatat behandlas med ett reguljärt uttryck. Reguljära uttryck är ett alldeles för stort område för att gås igenom här, men det finns gott om tutorials på nätet (t.ex. den här). Annars är Mastering Regular Expressions nog det mest heltäckande som finns om ämnet, om du vill lära dig mer.

Cave

Jo, glömde berätta att det finns en risk att om du har två eller flera filer likn
foo-output-1.2
foo-output-3.4
foo-output-6.5

där filnamnet före andra bindestrecket är identiskt för alla tre, så kan det tyvärr bli
så att när den andra filen döps om till foo-output.nnn så skriver den över den första
och likadant med den tredje som skriver över den andra. Sorry, men det blir väl en
rolig övning att fixa Retorisk fråga, har filnamnen någon betydelse eller är det
bara kosmetiskt?

  • Medlem
  • 2004-10-15 13:01

Filnamnen före bindestrecket är aldrig identiska.
att filnamnen ändras från tillexempel foo-output-1.2.3 foo till foo-output.xxx
är väsentligt för att scriptet ska fungera som jag tänkt

sed-kommando som tar bort allt bakom och inkl sista -

s/\(.*\)-.*$/\1/

lägg till evt ny text du vill ha på slutet efter 1:an och innan sista /. Med den här regexpen
spelar det ingen roll hur många bindestreck det finns totalt i filnamnet.

1
Bevaka tråden