2011-09-14 14 views
5

Piszę skrypt, który ma polecenie, aby wykonać jak niżej:nieoczekiwany EOF podczas poszukiwania dopasowania `"”

cat /abc | grep -v ^# | grep -i root | sed -e '\''s/"//g'\'' | awk '\''{print $2}'\'' 

Po uruchomieniu skryptu na SunOS, otrzymuję poniżej błędu:

test: line 1: unexpected EOF while looking for matching `"' 
test: line 3: syntax error: unexpected end of file 

Próbowałem z innej opcji .. ale bez powodzenia.

Need ktoś mi pomóc zidentyfikować, czego brakuje w powyższym poleceniu.

+0

Co próbujesz zrobić? Innymi słowy, jakie są twoje dane wejściowe i wyjściowe? Mam wrażenie, że możesz wykonać swoje zadanie tylko z awk. –

Odpowiedz

2

czym są te ucieczki?!

cat /abc | grep -v '^#' | grep -i root | sed -e '\''s/"//g'\'' | awk '\''{print $2}'\'' 
               ^  ^  ^   ^

Twój problem jest tam:

sed -e '\''s/"//g'\'' 
      ^unmatched 
+0

Czy ten podwójny cudzysłów w wyrażeniu powoduje ten błąd? – Mrun

+0

Próbowałem, wykonując następujące czynności: cat/abc | grep -v^# | grep -i root | sed -e \ 's/\ "// g \' | awk \ '{print $ 2} \' o/p jest: bash-2.05 # bash -x -v test cat/abc | grep - v^# | grep -i root | sed -e \ 's/\ "// g \' | awk \ '{print $ 2} \' + cat/ + grep -v '^ #' + grep -i root + sed-e '' \ '' s/"// g '\' '' Nierozpoznane polecenie: 's/"// g' + awk '' \ '' {print ''} '\' '' awk: błąd składniowy w pobliżu wiersza 1 awk: bailing poza linią 1 – Mrun

+0

Jak uciec pojedynczy cytat w skrypcie? – Mrun

0

cytowania wszystko jest źle. Dlaczego używasz pojedynczego cudzysłowu, ukośnika odwrotnego, pojedynczego cudzysłowu, pojedynczego cudzysłowu i zawsze w tej kolejności? Niezależnie od tego masz niecytowany podwójny cudzysłów, więc powłoka oczekuje, że dodasz wycenę zamykającą dla cytowanego ciągu, który zaczyna się od tego podwójnego cudzysłowu otwierającego.

Co do stylu, powinieneś także stracić numer Useless Use of Cat i pomyśleć o uproszczeniu skryptu. Co najmniej:

grep -v ^# /abc | grep -i root | sed -e 's/"//g' | awk '{print $2}' 

... ale w praktyce

awk '/^#/ { next } /[Rr][Oo][Oo][Tt]/ { gsub ("\"",""); print $2 }' /abc 

Ponieważ niektóre z tych znaków w skryptach awk i sed mają szczególne znaczenie dla powłoki, możemy umieścić je w pojedynczych cudzysłowach. Jeśli potrzebujesz pojedynczych cudzysłowów w skrypcie, musisz podwoić je; częsty wzorzec ma mieć ciąg w pojedynczych cudzysłowach przylegających do ciągu w podwójnych cudzysłowach, takich jak: echo '"'"'". To echo " (cytowane w pojedynczych cudzysłowach) zaraz po nim ' (cytowane w podwójnych cudzysłowach).

Edytuj Zaktualizowana analiza problemu cytowania; dodany przykład kodu; poprawiony przykład kodu. Ostatnia edycja poprawia cytowanie gsub w skrypcie awk i dodaje małą dyskusję o cytowaniu.

+0

to nie jest podwójny cudzysłów '' ', to tylko dwa pojedyncze cudzysłów obok siebie ('' ->' ''). To nie ma sensu – c00kiemon5ter

+0

sed -e 's/"// g" w tym, pojedyncze cudzysłowy są przecinane za pomocą \, jednak odwrotny ukośnik jest ujęty w pojedynczy cytat. – Mrun

+0

@ c00kiemon5ter Zauważyłem i zredagowałem swoją odpowiedź, zanim zobaczyłem twój komentarz. – tripleee

Powiązane problemy