Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.


Użytkownik



Witam,
Mam skrypt który wrzuca mi ścieżkę z dodanych plików.
plik_poczatkowy="zawartosc_poczatkowa" plik_koncowy="zawartosc_koncowa" sciezka_do_katalogu="/root/katalog1/" plik_do_wysylki="nowe_pliki.txt" link_dla_danych="\\serwer_new" diff $plik_poczatkowy $plik_koncowy | grep ">" | sed -e "s/>/$link_dla_danych/g" -e 's/\//\\/g' > $plik_do_wysylki
kiedy go wykonuje to dostaje komunikat:
sed: -e wyrażenie #1, znak 19: nieprawidłowe odwołanie \1 po prawej stronie polecenia `s'
Jeśli do zmiennej link_dla_danych wrzucę:
link_dla_danych="\\\\serwer_new"
(dwa dodatkowe slashe)
to skrypt wykonuje się bez problemu.
wtedy do pliku nowe_pliki.txt dostaję nowy wpis:
\serwer_new \root\katalog1\plik32.txt
jak widać wrzucany jest z przodu tylko jeden slash a powinno być:
\\serwer_new \root\katalog1\plik32.txt
do tego myślę jeszcze aby usuwać wskazaną część ścieżki oraz tą spację po \\serwer_new
tak aby wynik był taki:
\\serwer_new\katalog1\plik32.txt
ma ktoś może pomysł jak to w jednym diffie załatwić?
pozdrawiam :)
Ostatnio edytowany przez debbie (2016-07-04 00:35:55)
Offline

Użytkownik


Dosyć zagmatwany opis problemu.
Ogólnie w bashu znak \ jest traktowany jako specjalny, pozwalający "odczarować" kolejny znak tak, żeby ów nie był traktowany jako specjalny. Dotyczy to również jego samego. Polecam przeanalizować i wyciągnąć wnioski:
$ echo "$DISPLAY" :0.0 $ echo "\$DISPLAY" $DISPLAY $ var="\\1234"; echo "$var" \1234 $ var='\\1234'; echo "$var" \\1234
Offline



Łowca lamerów



Dark Sith




Ja podawałem rozwiązanie... Dlaczego nie działa? Co zwraca?
Skoro pipeline się nie sprawdza to może jednak trzeba pętlą przejechać plik różnic?
Sed'em każdą linie załatwić i poskładać zmiennymi "stringi".
Offline
@debbie
Jeśli dobrze zrozumiałem to chcesz tego...
Prosze:
diff $plik_poczatkowy $plik_koncowy | grep ">" | sed -e "s/>/$link_dla_danych/g" -e 's/\//\\/g' | awk '$0="\\"$0' | tr -d ' ' > $plik_do_wysylki
Ostatnio edytowany przez SamozwańczyKrólBasha (2016-07-05 08:49:37)
Offline



Dark Sith




diff $plik_poczatkowy $plik_koncowy | grep "> " | sed -e "s/> /$link_dla_danych/g" -e 's/\//\\/g' | awk '$0="\\"$0' > $plik_do_wysylki
Takie tam dopieszczanie ;)
Ten trim to tak chyba bardziej z przyzwyczajenia :)
Offline
Napisałeś:
do tego myślę jeszcze aby usuwać wskazaną część ścieżki oraz tą spację po \\serwer_new
Dlatego dałem tego "tr" :) Ale masz rację, maniakalnie tego używam :)
Offline


Użytkownik



Wszystko jest niby OK...tylko kiedy w zmiennej
link_dla_danych="\\serwer_new"
po wykonaniu powyższego dostaje:
sed: -e wyrażenie #1, znak 20: nieprawidłowe odwołanie \1 po prawej stronie polecenia `s'
kiedy zaś mam dwa slashe więcej:
link_dla_danych="\\\\serwer_new"
wtedy wszystko jest okej.
moge zrobić jeszcze tak, że zmienną link_dla_danych ustawię bez slashy...
link_dla_danych="serwer_new"
tylko w wyniku ( w pliku txt wynikowym ) musze mieć np taki wpis:
\\serwer_new\root\katalog1\sjdadjasdas.txt
do tego chciałbym do dodatkowej zmiennej wrzucić
zmienna_do_wyciecia="\root"
tak aby wynikiem było:
\\serwer_new\katalog1\sjdadjasdas.txt
Ostatnio edytowany przez debbie (2016-07-05 14:17:04)
Offline
No dobra. To teraz tak na szybko, na siłe, brzydko i brudno. Wyłapiesz jednal na tej podstawie jak upiększyć swój kod
pan_zmienna=$(diff $plik_poczatkowy $plik_koncowy | grep ">" | sed -e "s/>/$link_dla_danych/g" -e 's/\//\\/g')
echo $(echo $pan_zmienna | awk '{print $1}') $(echo ${pan_zmienna##*root}) | tr -d ' ' | awk '$0="\\"$0'@debbie
Było by lepiej jakbyś pokazał cały kod :) To by nam ułatwiło zadanie
Ostatnio edytowany przez SamozwańczyKrólBasha (2016-07-06 09:19:17)
Offline



Dark Sith




plik_poczatkowy="plik1.txt" plik_koncowy="plik2.txt" plik_do_wysylki="nowe_pliki.txt" do_wyciecia="> /root" do_wklejenia="\\\\serwer" diff $plik_poczatkowy $plik_koncowy | grep "> " | sed -e "s,$do_wyciecia,$do_wklejenia,g" | sed -e 's,\/,\\,g' | awk '$0="\\"$0' > $plik_do_wysylki
Nie róbmy naokoło....
Na biedę można byłoby jeszcze użyć cut z opcją c lub b, bo każda linia zaczyna się taka samą ilością znaków.
Offline


Użytkownik



Dzięki bardzo...jednak odnosząc się do powyższego..
jesli zmienna jest:
do_wklejenia="\\\\serwer"
to jest okej...ale u mnei zmienna wygląda:
do_wklejenia="\\serwer"
i wtedy w wyniku ( otrzymuje z przodu tylko jeden slash z przodu np:
\serwer_new\katalog1\sjdadjasdas.txt
).
Offline
No to dlatego masz
| awk '$0="\\"$0'
. Dzięki temu dostaniesz dodatkowy \ na począdku wiersza.
Offline


Użytkownik



Tyle że dostaje tylko jeden...a powinny byc dwa...
\\serwer_new\katalog1\sjdadjasdas.txt
Offline

Użytkownik


spróbuj zamiast
do_wklejenia="\\serwer"
użyć
do_wklejenia='\\serwer'
Offline


Użytkownik



GRA GITARA! :D Dzięki bardzo Seler :)))) o to mi chodziło :)
Offline