Jak usunąć znaki nowej linii z pliku tekstowego?

116

Mam następujące dane i muszę to wszystko umieścić w jednym wierszu.

Mam to:

22791

;

14336

;

22821

;

34653

;

21491

;

25522

;

33238

;

Potrzebuję tego:

22791;14336;22821;34653;21491;25522;33238;

EDYTOWAĆ

Żadne z tych poleceń nie działa idealnie.

Większość z nich pozwala, aby dane wyglądały następująco:

22791

;14336

;22821

;34653

;21491

;25522
Alucard
źródło
15
Kopiuj i wklej do paska adresu przeglądarki lub innego pola tekstowego. Quick'n'dirty, ale działa dla małych ilości danych.
ignis

Odpowiedzi:

245
tr -d '\n' < yourfile.txt

Edytować:

Jeśli żadne z zamieszczonych tutaj poleceń nie działa, masz coś innego niż znak nowej linii oddzielający pola. Być może masz w pliku zakończenia linii DOS / Windows (chociaż spodziewałbym się, że rozwiązania Perla będą działać nawet w tym przypadku)?

Próbować:

tr -d "\n\r" < yourfile.txt

Jeśli to nie zadziała, będziesz musiał dokładniej przyjrzeć się plikowi (np. W edytorze szesnastkowym), aby dowiedzieć się, jakie znaki są tam faktycznie, które chcesz usunąć.

Tyler McHenry
źródło
7
Jak zapisujesz te dane wyjściowe do tego samego lub innego pliku?
StackOverflowOfficial
3
Myślę, że trnie nadaje się do pustych linii. Co myślisz? - - Myślę, że sedto najlepsza opcja, jak opisana tutaj stackoverflow.com/q/16414410/54964
Léo Léopold Hertz 준영
Aby skierować dane wyjściowe do innego pliku, po prostu użyj przekierowania wyjścia. Aby skierować go do tego samego pliku, przepuść go do "sponge" (dostępne w pakiecie "moreutils" w systemach bazowych Debiana).
plugwash
Aby zapisać dane wyjściowe do tego samego pliku, użyj podpowłokiecho -n $(tr -d "\n" < yourfile.txt) > yourfile.txt
andpei
11
perl -p -i -e 's/\R//g;' filename

Muszę wykonać pracę.

ZyX
źródło
Golfy doperl -pie 's/\R//g' filename
Trenton
9
paste -sd "" file.txt
Amardeep AC9MF
źródło
1
W systemie Solaris (10) paste -sd ""nie działa domyślnie na STDIN, więc jeśli do niego (some command) | paste -sd "" -
podłączasz
To nie działa, jeśli chcesz również usunąć ostatnią nową linię . Usuwa tylko pośrednie znaki nowej linii.
josch
To nie działało w systemie Mac OS, tak było w wersji Sundeep. paste -sd'\0' -
Trenton
7
tr -d '\n' < file.txt

Lub

awk '{ printf "%s", $0 }' file.txt

Lub

sed ':a;N;$!ba;s/\n//g' file.txt

Ta strona tutaj ma kilka innych metod do nowej linii usunąć.

edytowano, aby usunąć nadużycia kotów

Vivin Paliath
źródło
4

posługiwać się

head -n 1 filename | od -c 

dowiedzieć się, CO jest obrażającą postacią. następnie użyj

tr -d '\n' <filename

dla LF

tr -d '\r\n' <filename

dla CRLF

Pan
źródło
4

Możesz edytować plik w vimie:

$ vim inputfile
:%s/\n//g
loganaayahee
źródło
2
i zastąpić spacjami::%s/\n/ /g
Remi Mélisson
2

Korzystanie z man 1 ed:

# cf. http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed 
ed -s file <<< $'1,$j\n,p'  # print to stdout 
ed -s file <<< $'1,$j\nwq'  # in-place edit
carlmund
źródło
2

Fakt Nerd: zamiast tego użyj ASCII.

tr -d '\012' < filename.extension   

(Edytowano, ponieważ nie widziałem pieprzonej odpowiedzi, która miała to samo rozwiązanie, jedyną różnicą było to, że moja miała ASCII)

Byfjunarn
źródło
2

Użyj seda z klasami POSIX

Spowoduje to usunięcie wszystkich wierszy zawierających tylko spacje (spacje i tabulatory)

sed '/^[[:space:]]*$/d'

Po prostu weź wszystko, z czym pracujesz i podłącz to do tego

Przykład

cat filename | sed '/^[[:space:]]*$/d'

jasonleonhard
źródło
sed -i '/ ^ [[: spacja:]] * $ / d' nazwa_pliku ... do edycji na miejscu; odpowiedź jak powyżej wyświetli się na ekranie
BradChesney79
1
$ perl -0777 -pe 's / \ n + // g' wejście> wyjście
$ perl -0777 -pe 'tr / \ n // d' wejście> wyjście
Greg Bacon
źródło
1

Jeśli dane znajdują się w pliku file.txt, to:

echo $(<file.txt) | tr -d ' '

Znak „ $(<file.txt)” odczytuje plik i podaje zawartość jako serię słów, które „odbijają się”, a następnie odbijają się spacją między nimi. Następnie polecenie „tr” usuwa wszelkie spacje:

22791;14336;22821;34653;21491;25522;33238;
Jonathan Leffler
źródło
Działa to, o ile dane wejściowe nie są zbyt duże i tak długo, jak używasz Bash (oznaczonego jako Bash, więc to jest OK). Gdybym teraz pisał odpowiedź, tak by była tr -d '\n' < file.txt, co robi zaakceptowana odpowiedź (i jestem zaskoczony, że wtedy jej nie napisałem). Prawdopodobnie zostało to napisane tylko po to, aby pokazać „jeszcze jeden sposób na zrobienie tego”.
Jonathan Leffler
1

xargs zużywa również znaki nowej linii (ale dodaje ostatnią końcową nową linię):

xargs < file.txt | tr -d ' '
marky
źródło
1

Zakładając, że chcesz zachować tylko cyfry i średniki, poniższe czynności powinny załatwić sprawę, zakładając, że nie ma większych problemów z kodowaniem, chociaż usunie też ostatnią „nową linię”:

$ tr -cd ";0-9"

Możesz łatwo zmodyfikować powyższe, aby uwzględnić inne znaki, np. Jeśli chcesz zachować kropki dziesiętne, przecinki itp.

szczyt
źródło
1

Korzystanie z edytora tekstu gedit (3.18.3)

  1. Kliknij Wyszukaj
  2. Kliknij Znajdź i zamień ...
  3. Wejdź \n\sw pole Znajdź
  4. Pozostaw Zastąp puste (nic)
  5. Zaznacz pole Wyrażenie regularne
  6. Kliknij przycisk Znajdź

Uwaga: to nie rozwiązuje dokładnie pierwotnego, 7-letniego problemu OP, ale powinno pomóc niektórym użytkownikom systemu Linux noob (takim jak ja), którzy znaleźli drogę tutaj z SE z podobnymi pytaniami „Jak uzyskać mój tekst w jednej linii” .

Hastig Zusammenstellen
źródło
1

Miałem dziś ten sam przypadek, bardzo łatwy w vimie lub nvim, możesz użyć gJdo łączenia linii. W swoim przypadku po prostu zrób

99gJ

to dołączy do wszystkich twoich 99 linii. Możesz dostosować liczbę 99według potrzeb w zależności od liczby linii do połączenia. Jeśli dołączysz tylko do jednej linii, gJto wystarczy.

LeOn - Han Li
źródło
0

Zrobiłbym to za pomocą awk, np

awk '/[0-9]+/ { a = a $0 ";" } END { print a }' file.txt

(wadą jest to, że a jest „gromadzone” w pamięci).

EDYTOWAĆ

Zapomniałem o printf! Tak też

awk '/[0-9]+/ { printf "%s;", $0 }' file.txt

lub prawdopodobnie lepiej, co zostało już podane w innych odpowiedziach używających awk.

ShinTakezou
źródło
0

Zwykle dostaję ten przypadek, gdy kopiuję fragment kodu z pliku i chcę go wkleić do konsoli bez dodawania niepotrzebnych nowych linii, skończyło się na utworzeniu aliasu bash
(nazwałem go, onelinejeśli jesteś ciekawy)

xsel -b -o | tr -d '\n' | tr -s ' ' | xsel -b -i
  • xsel -b -o czyta mój schowek

  • tr -d '\n' usuwa nowe linie

  • tr -s ' ' usuwa powtarzające się spacje

  • xsel -b -i przesyła to z powrotem do mojego schowka

potem wklejałem nową zawartość schowka do oneline w konsoli lub czymkolwiek.

Mohammad AbuShady
źródło
0

Brakuje Ci najbardziej oczywistej i szybkiej odpowiedzi, zwłaszcza gdy musisz to zrobić w GUI, aby naprawić dziwne zawijanie słów.

  • otwarty gedit

  • Następnie Ctrl+ H, następnie umieść w polu Findtekstowym \ni w Replace withpuste miejsce, a następnie wypełnij pole wyboru Regular expressioni voila.

Eduard Florinescu
źródło
0

Aby również usunąć końcowy znak nowej linii na końcu pliku

python -c "s=open('filename','r').read();open('filename', 'w').write(s.replace('\n',''))"
crizCraig
źródło