/ / Skrypty powłoki niechciane "?" znak na końcu nazwy pliku - bash, shell, cp

Skrypty powłoki niechciane "?" znak na końcu nazwy pliku - bash, shell, cp

Otrzymuję niechciane "?" na końcu mojej nazwy pliku podczas wykonywania tego:

emplid=$(grep -a "Student ID" "$i".txt  | sed "s/(Student ID:  //g" | sed "s/)Tj//g" )
#gets emplid by doing a grep from some text file
echo "$emplid"   #prints employee id correctly
cp "$i" "$emplid".pdf  #getting an extra "?" character after emplid and before .pdf

tj. zamiast nazwy pliku, takiej jak 123456.pdf, otrzymuję 123456? .pdf. Dlaczego tak się dzieje, jeśli echo drukuje poprawnie? Jak usunąć znaki końcowe z znakami zapytania?

Odpowiedzi:

7 dla odpowiedzi № 1

Wygląda na to, że twój skrypt ma styl DOSzakończenia linii (rn) zamiast stylu unix (tylko n) - gdy skrypt w tym formacie, r traktowany jest jako część poleceń. W tym przypadku jest on uwzględniany w $ emplid, a zatem w nazwie pliku.

Wiele platform obsługuje dos2unix polecenie, aby przekonwertować plik na zakończenia linii w stylu unix. A po konwersji, trzymaj się edytorów tekstu, które obsługują pliki tekstowe w stylu Unix.

EDYTOWAĆ: Zakładam, że końcówki linii problemowej były w skrypcie powłoki, ale wygląda na to, że zamiast tego znajdują się w pliku wejściowym ("$ i" .txt). Możesz użyć dos2unix na pliku wejściowym, aby go wyczyścić i / lub dodać Krok czyszczący do polecenia sed w twoim skrypcie. BTW, możesz mieć jedną instancję sed zastosować kilka zmian z opcją -e:

emplid=$(grep -a "Student ID" "$i".txt  | sed "-e s/(Student ID:  //g" -e "s/)Tj//g" -e $"s/r$//" )

Polecam przeciwko za pomocą sed "s/.$//" - jeśli plik jest w formacie unix, to odetnie ostatni znak nazwy pliku.


0 dla odpowiedzi nr 2

za pomocą komendy file wykrywa, czy jest to czysty system uniksowy, czy zmieszany z systemem DOS.

Plik DOS: tekst ASCII, z terminatorami linii CRLF

Plik uniksowy jest czystym plikiem ASCII.