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/.
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
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
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
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
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
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
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
Tyle że dostaje tylko jeden...a powinny byc dwa...
\\serwer_new\katalog1\sjdadjasdas.txt
Offline
spróbuj zamiast
do_wklejenia="\\serwer"
użyć
do_wklejenia='\\serwer'
Offline
GRA GITARA! :D Dzięki bardzo Seler :)))) o to mi chodziło :)
Offline