2009-10-05 20 views
10

Próbuję zrobić odwrotnie niż this question, zastępując końcówki linii Unix końcówkami linii Windows, dzięki czemu mogę use SQL Server bcp over samba to import the file. Mam zainstalowany sed, ale nie dos2unix. Próbowałem odwrócić przykłady, ale bezskutecznie.Zastąp n r nw uniksowym pliku

Oto polecenie, którego używam.

sed -e 's/\n/\r\n/g' myfile 

wykonałem to i pobiegł od -c myfile, spodziewając się zobaczyć \r\n gdzie znajdowały się \n. Ale wciąż jest wszystko: \n. (Lub przynajmniej wydają się być. Wyjście przepełnienia mojego bufora ekranowego, więc nie widzę początku pliku).

Nie byłem w stanie dowiedzieć się, co robię źle. Jakieś sugestie?

+0

Nie masz dostępnego kompilatora? –

+0

Jaki rodzaj kompilatora? –

+0

, aby zobaczyć górną część pliku: od -c filename | mniej –

Odpowiedz

11
  • Jaki jest problem z uzyskaniem dos2unix na maszynę?
  • Na jakiej platformie pracujesz?
  • Czy masz GNU sed lub zwykłego nie-GNU sed?

Na Solaris /usr/bin/sed wymaga:

sed 's/$/^M/' 

gdzie wprowadzeniu '^ M' wpisując kontroliVsterowaniaM. '$' Dopasowuje na końcu linii i zastępuje koniec linii kontrolką-M. Możesz również napisać scenariusz.

Mechanizmy, które oczekują, że sed będzie można rozwinąć "\r" lub "\\r" w celu kontroli-M, będą w najlepszym wypadku zależne od platformy.

+0

To załatwiło sprawę. Być może uda mi się uzyskać dos2unix, ale miałem nadzieję, że wykorzystam istniejące oprogramowanie. Pracuję w systemie AIX. Zakładam, że jest to wersja inna niż GNU. Teraz, kiedy o tym wspomniałeś użyłem triku control-v control-m w vi, powinienem pomyśleć o tym. Dzięki. –

-1

Może jeśli spróbujesz to w ten sposób

cat myfile | sed 's/\n/\r\n/g' > myfile.win 

zadziała z moim zrozumieniu właśnie dokonywania zamienniki do wyjścia konsoli trzeba przekierować dane wyjściowe do pliku, w tym przypadku myfile.win, możesz zmienić nazwę tego, co chcesz. Cały scenariusz byłby (działa wewnątrz katalogu pełen tego rodzaju plików):

#!/bin/bash 
for file in $(find . -type f -name '*') 
do 
    cat $file | sed 's/\n/\r\n/g' > $file.new 
    mv -f $file.new $file 
done 
+1

-1. nie działa dla mnie. – Peter

+0

well jest specyficzna dla platformy, odpowiedź Jonathana Lefflera jest lepsza – Juparave

3

Nie trzeba wybrać opcję -e.

$ dopasowuje znak końca linii. To polecenie sed wstawi \r znak przed końcem linia:

sed 's/$/\r/' myfile 
+1

Dzięki za sugestię, ale z jakiegoś powodu po prostu przykleja ona r na końcu pliku. –

+0

Zgodnie z podręcznikiem informacyjnym dla GNU sed: "Wszystkie wprowadzone tutaj eskapowania są rozszerzeniami GNU, z wyjątkiem' \ n '. ". – hlovdal

+0

Moja wina za brak określenia smaku Unix. Używam systemu AIX. +1 za to, że jako pierwszy wskazałem, że powinienem szukać wartości $ zamiast \ n. –

13

W obliczu tego, używam prostego perl jedno-liner:

perl -pi -e 's/\n/\r\n/' filename 

ponieważ sed zachowanie zmienia się, i wiem, że to działa.

+0

Tak, to najlepsza przenośna opcja. Wprowadzone ręcznie^M i niewiarygodne rozszerzenia \ r są showstopperami. –

1

Wystarczy dodanie \r (aka ^M patrz odpowiedź Jonathana Lefflera) przed \n nie jest bezpieczne, ponieważ plik może mieć tryb mieszany EOL, więc wtedy ryzykujemy ty kończąc niektóre linie becomming \r\r\n. Bezpiecznym rozwiązaniem jest najpierw usunięcie wszystkich znaków \ ​​r, a następnie wstawienie (pojedynczego) \r przed \n.

#!/bin/sh 
sed 's/^M//g' ${1+"[email protected]"} | sed 's/$/^M/' 

Zaktualizowano do użytku ^M.

0

Spróbuj użyć:

echo " this is output" > input 
sed 's/$/\r/g' input |od -c 
1
sed 's/\([^^M]\)$/\0^M/' your_file 

To sprawia, że ​​na pewno tylko wstawić \ r, gdy nie ma \ r \ n przed. To działało dla mnie.

Powiązane problemy