Skocz do zawartości

Jak Wyciągnąć Stały Człon W Nazwie Pliku.


morg

Rekomendowane odpowiedzi

Witam!

 

Mam kilka katalogów w których przewija mi się jakiś stały człon. Dla tych katalogów chcę zrobić jakąś akcję która nie będzie wykonywana w przypadku gdy skrypt będzie pracował w katalogu który nie zawiera w nazwie stałego członu.

 

Wydzielam nazwę ostatniego członu z $PWD:

 

katalog=`pwd | awk 'BEGIN { FS="/"} {print $NF}' `

 

 

i dalej chciałbym to zrobić poprzez funkcję case. Ale tutaj juz kończy się moja wiedza.

 

Dla przykladu:

Stałym członem bedzie "kat" i "zas".

 

- katalog1

- katalog2

- zasob3

- zasob4

 

W jaki sposób wydzielić działanie programu dla katalogu 1 i 2 ale zablokować dla zasobu 3 i 4 ?

Bo kat* nie jest rozpoznawane.

 

 

Uruchom()
{
case ${katalog} in
  "kat*")         polecenie="$wywolaj_exe1"
        ;;
  "zas*")         polecenie="$wywolaj_exe2"
        ;;
  *)            polecenie=""
;;
esac
$polecenie
}

 

 

Z góry dziękuję za pomoc.

 

M.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Bo kat* nie jest rozpoznawane.
Bo * jest rozwijane przez shella w liście parametrów, a nie przez skrypt przy porównywaniu łańcuchów w case. Użyj wyrażeń regularnych: albo sed-em, albo w bashu za pomcoą konstrukcji
 if [[ "$zmienna" =~ "wyrażenie" ]]; then

np. -- ostrzegam, przykład jest głupi

wzorzec="^dane.*"
if [[ "$katalog" =~ "wzorzec" ]]; then
tar -cf $katalog.tar $katalog
fi

Odnośnik do komentarza
Udostępnij na innych stronach

Zapomniałem dodać ze to ma też działac na starym AIX'ie na którym nie ma " =~ " .

 

 

Rzuce jeszcze okiem na to:

 

wzorzec="^dane.*"
if [[ "$katalog" =~ "wzorzec" ]]; then
tar -cf $katalog.tar $katalog
fi

 

Przyklad nie jest glupi. On daje rozwiązanie.

 

Dzieki

m.

 

EDIT:

 

Co może rozwinąć listę parametrów, oprócz implementacji kodu źródłowego basha do skryptu?

 

EDIT2:

 

Masz na myśli jakąś składnie sed'a, która wskaże katalog roboczy w którym znajduje się zdefiniowany ciąg? Mógłbyś podać przykład?

 

 

Przewertowałem nieco sieć i z sensowniejszych rzeczy znalazłem:

http://pl.wikipedia.org/wiki/Sed_(program)

http://www.digipedia.pl/man/sed.1.html

http://sed.sourceforge.net/

http://sed.sourceforge.net/sed1line.txt

http://www.debian.org/doc/manuals/reference/ch-tips.pl.html

 

 

EDIT3:

 

Np coś takiego:

 sed -n '/regexp/p'           # method 1
sed '/regexp/!d'             # method 2

 

 

 

Tylko nie bardzo wiem jak to zaimplementować w kod by stworzyć spójną i działającą całość.

Odnośnik do komentarza
Udostępnij na innych stronach

Rozwiązanie:

 

aix:/wdr/bazy/gb$ ls
nazwa_katalogu_bez_wzorca  nazwa_katalogu_z_wzorzec
aix:/wdr/bazy/gb$ a=`ls |grep -e wzorzec`
aix:/wdr/bazy/gb$ cd $a
aix:/wdr/bazy/gb/nazwa_katalogu_z_wzorzec$

 

Dzieki za pomoc.

 

 

M.

Odnośnik do komentarza
Udostępnij na innych stronach

Co może rozwinąć listę parametrów, oprócz implementacji kodu źródłowego basha do skryptu?
Np. pętle for i while działające na listach, jak
for plik in *; do
echo $plik; done

Masz na myśli jakąś składnie sed'a, która wskaże katalog roboczy w którym znajduje się zdefiniowany ciąg?
Nie. Chodziło mi o doraźne przepuszczenie ścieżki przez sed-a, żeby dowiedzieć się, czy jest zgodna z wzorcem. Zamiast =~ z wzorcem regularnym, zmuszamy sed-a do przekształcenia łańcucha na okoliczność dopasowania, a wynik przyrównujemy do stałego wzorca:
plik=$1
wzorzec='a'
if [[ `echo $plik | sed -e "s/^$wzorzec.*/$wzorzec/"` == $wzorzec ]]; then
  echo $plik dopasowany do $wzorzec
else
  echo niedopasowany
fi

Przy czym na pewno da się zrobić to zgrabniej.

 

// edit

Dla listy trzeba by wyciąć wiersze niedopasowane do wzorca. W sed-zie coś w rodzaju

`ls | sed -e "/^$wzorzec/! d"`

Ale jasne, w opisanym przez ciebie przypadku grep wystarczy.

Odnośnik do komentarza
Udostępnij na innych stronach

 

Moje rozwiązanie nie do końca mi pasuje bo muszę się przygotować na kilka katalogów z takim samym wzorcem, a w Twoim @jjj nie wiem co wstawić w zmienną $plik. Jeśli nie wstawię to $plik ma pustą wartość i wynik polecenia zawsze jest na "else".

 

 

 

Z sed'em jeszcze takie eksperymenty przychodzą mi do głowy:

 

 

aix:/wdr/bazy/22101/gb$ ls
AAA                        c                          nazwa_katalogu_bez_wzorca
a                          d                          nazwa_katalogu_z_wzorzec
b                          e
aix:/wdr/bazy/22101/gb$ wzorzec=A
aix:/wdr/bazy/22101/gb$ ls | sed  -n  "/$wzorzec/p"
AAA
aix:/wdr/bazy/22101/gb$ wzorzec=wzorzec
aix:/wdr/bazy/22101/gb$ ls | sed  -n  "/$wzorzec/p"
nazwa_katalogu_z_wzorzec
aix:/wdr/bazy/22101/gb$ wzorzec=nazwa
aix:/wdr/bazy/22101/gb$ ls | sed  -n  "/$wzorzec/p"
nazwa_katalogu_bez_wzorca
nazwa_katalogu_z_wzorzec
aix:/wdr/bazy/22101/gb$

 

 

Popatrzę na to na weekendzie, bo mi właśnie komputer wrócił z naprawy, i może coś czasu wygospodaruje.

M.

 

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Rozwiązałem to poprzez pętle for, Dziękuję za pomoc.

 

m.

 

 

Edit1.

 

Nie do końca rozwiązałem:

 

wersja 1

 

 

rozdzielpliki()
{

wzorzec= katalog1 katalog2 katalog3 katalog4
case $wzorzec in
"katalog1")     echo katalog1
    ;;
  "katalog2") echo katalog2
    ;;
  "katalog3") echo katalog3
    ;;
  "katalog4")     echo katalog4
    ;;
  *)    echo pusto
    ;;
esac

}

 

 

wersja 2

 

rozdzielpliki()
{


case $wzorzec in
"` ls ../ | sed  -n  "/$katalog1/p"` ")     echo katalog1
    ;;
  " `ls ../ | sed  -n  "/$katalog2/p"` ") echo katalog2
    ;;
  " `ls ../ | sed  -n  "/$katalog3/p"`") echo katalog3
    ;;
  " `ls ../ | sed  -n  "/$katalog4/p"`")     echo katalog4
    ;;
  *)    echo pusto
    ;;
esac

}

 

 

Wersja 1 ladniejsza i czytelniejsza ale brakuje mi wiedzy w jaki sposób dodać do zmiennej $wzorzec kilkanaście różnych (stałych) nazw .

 

 

m.

Odnośnik do komentarza
Udostępnij na innych stronach

W nowym poście coby nie zaśmiecać:

 

tablica[1]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed  -n  "/alog1/p"`
tablica[2]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed  -n  "/alog2/p" `
tablica[3]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed  -n  "/alog3/p" `
tablica[4]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed  -n  "/alog4/p" `

case `echo ${tablica[@]}` in
  "katalog1")       echo katalog1
                        ;;
  "katalog2")            echo katalog2
                        ;;
  "katalog3")        echo katalog3
;;
  "katalog4")                echo katalog4
                        ;;
  *)                    echo nie dziala
;;
esac

 

 

Przykład działa w strukturze katalogów zgodnych z pełnymi nazwami (katalog1, katalog2, ...). W jaki sposób odwrócić tak by wzorce były w funkcji case a ta dopasowywała by wzorce do $PWD w którym pracuje?

m.

Odnośnik do komentarza
Udostępnij na innych stronach

Poniższy przykład działa dla każdego katalogu. W tym sensie, że:

- dla katalogu który jest zdefiniowany w zmiennej tablicowej

- dla katalogu dla którego nie ma zdefiniowanej zmiennej.

 

f()
{
tablica[1]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed  -n  "/alog1/p"`
tablica[2]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed  -n  "/alog2/p" `
tablica[3]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed  -n  "/alog3/p" `
tablica[4]=`pwd | awk 'BEGIN { FS="/"} {print $NF}' | sed  -n  "/alog4/p" `

if
# [[ "`echo ${tablica[@]}`" = "" ]]
# lub ładniejsze

if [ -z `echo ${tablica[@]}` ]

then
printf "\n\n\n\n \t\t\t koniec pracy bo pusta tablica"
else
printf "\n\n\n\n \t\t\t dziala, bo tablica wypelniona "

echo tablica to : `echo  ${tablica[@]}`

fi
}

 

Zasada działania jest prosta. W przypadku gdy funkcja napotka zdefiniowany ze wzorcem katalog wykona określony kod. W tym przypadku mało skomplikowany printf informujący o pwd zgodnym z jakąś tablicą. W innym przypadku też mało skomplikowany printf ze tablica jest pusta.

 

m.

 

 

 

edit: korekta warunku (if [ -z `echo ${tablica[@]}` ])

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...