Bash, sed, if - sprawdzanie, czy dana linia sk

Potrzebujesz pomocy z C, C++, perl, python, itp.
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Bash, sed, if - sprawdzanie, czy dana linia składa się tylko z danego tekstu

Post autor: timo »

Witam.

Bash, sed, if - sprawdzanie, czy dana linia składa się tylko z danego tekstu - oto mój przykładowy kod:

Kod: Zaznacz cały

q=309
x=`sed -n "$q"p tmp1`
if [ "$x" != "nazwa" ];then
	echo 1
	else
	echo 0
fi
Linia nr 309 w pliku tmp1 składa się tylko ze słowa nazwa, więc powinno zwrócić 0, ale zwraca mi 1, tak samo, jak wtedy, gdy w warunku if umieszczę dowolny inny ciąg znaków. Gdzie zrobiłem błąd?
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Kod: Zaznacz cały

#!/bin/bash

q=309
x=`sed -n "$q"p < tmp1`
echo $x
if [ "$x" == "nazwa" ]; then
        echo 1
        else
        echo 0
fi
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Post autor: timo »

No niestety, po skopiowaniu kodu mariacziego konsola zwraca:

Kod: Zaznacz cały

nazwa
: unexpected operator
0
a w takim układzie powinna zwrócić 1. Po zamianie == na -e jest tak samo, a po zmianie na pojedyncze = mam bez błędu : unexpected operator, ale wciąż daje 0 zamiast 1.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Napisz w jaki sposób kopiowałeś kod do skryptu.
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Post autor: timo »

Jakkolwiek bym nie kopiował - efekt ten sam - czy zaznaczając przez przeciąganie po kodzie myszką z wciśniętym lewym klawiszem, czy przez trzykrotne kliknięcie w polu z kodem i potem opcja Kopiuj z menu kontekstowego. Wklejam do pustego okna edytora KWrite przez Ctrl-v i zapisuję pod nazwą Skrypt10. Uruchamiam komendą

Kod: Zaznacz cały

sh Skrypt10
Wiem, że są 2 schowki i do jednego tekst trafia przez samo zaznaczenie (i wkleja się środkowym klawiszem myszy), a do drugiego przez Ctrl-c albo opcję Kopiuj (i potem Ctrl-v albo Wklej), także z tym na pewno nic nie namieszałem.
Jakby nie patrzeć, wygląda na to, że błąd jest w instrukcji if, bo echo zwraca prawidłową zawartość żądanej linii. Nie wiem, czy to nie jest kwestia niewidocznego przecież znaku końca linii. Próbowałem:

Kod: Zaznacz cały

#!/bin/bash

q=309
x=`sed -n "$q"p < tmp1 | tr -d '\n'`
echo $x
if [ "$x" = "nazwa" ]; then
        echo 1
        else
        echo 0
fi
ale niestety, też zwraca 0 zamiast 1.
Ewidentnie błąd jest gdzieś w if, bo teraz męczę się z takim czymś:

Kod: Zaznacz cały

while read line;do
			ontlnr=`echo $line | awk '{gsub(";;;;;;numer ","")}1' | awk '{gsub(";;","")}1'`
			echo $ontlnr
			otlnr=`echo $ontlnr | cut -d: -f2`
			echo $otlnr
			if [ "$otlnr" = "2" ];then
				echo tak
			fi
done < tmp2
i zwraca:

Kod: Zaznacz cały

325:26
26
359:26
26
393:2
2
461:2a
2a
495:26
26
529:26
26
a powinno po wyświetleniu liczby 2 będącej wartością zmiennej otlnr wyświetlić słowo tak, ale go nie wyświetla. Proszę o pomoc, bo nie mam pojęcia, co robię źle...
Awatar użytkownika
kodama
Junior Member
Posty: 633
Rejestracja: 23 maja 2010, 22:30
Lokalizacja: Poznań

Post autor: kodama »

Z czystej ciekawości pozwoliłem sobie przetestować kod podany przez mariacziego i uruchamiając go w sposób:

Kod: Zaznacz cały

sh nazwa_skryptu
zwraca błąd:

Kod: Zaznacz cały

unexpected operator
ale uruchamiając go tak:

Kod: Zaznacz cały

 ./nazwa_skryptu
działa bezproblemowo. Po wrzuceniu do /usr/local/bin też działa ,,normalnie''. Jaka jest zatem różnica w uruchamianiu skryptu?
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Post autor: timo »

U mnie też uruchomienie przez:

Kod: Zaznacz cały

./nazwa_skryptu
nie daje błędu, co nie zmienia faktu, że zwraca

Kod: Zaznacz cały

nazwa
0
a powinien

Kod: Zaznacz cały

nazwa
1
więc, ciągle coś jest nie tak, tylko co?
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Plik, który parsujesz jest utworzony pod linuksem czy windowsem?
W razie gdybyś miał w źródle białe znaki na końcu linii, można np. tak

Kod: Zaznacz cały

#!/bin/bash

q=6
x=`sed -n "$q"p < tmp1 | sed -e 's/  *$//'`
echo $x
if [ "$x" == "nazwa" ]; then
        echo 1
        else
        echo 0
fi
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Post autor: timo »

Plik tmp1 to kod strony www pobrany za pomocą curla, a potem trochę oczyszczony ze znaczników html i innych śmieci sedem, awkiem i perlem. Chyba znalazłem przyczynę - koniec linii w tym pliku jest oznaczony, jak w Windowsie - zaraz poszukam w Google, jak to zmienić.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Jak możesz, to pokaż ten plik, który parsujesz.
Wstaw jako załącznik coby był w oryginale jakim Ty go czytasz.
Ja zrobiłem dla testów pliczek tmp1 o zawartości

Kod: Zaznacz cały

2w7893
jweoip
uo23
joiewp
oewi
nazwa
323
rfe
324
fret
i z nim kod, który zamieściłem działa tak jak powinien. Również, jeśli na końcu sprawdzanej linii będą spacje.
ODPOWIEDZ