Jak zamienić spacje na nowe linie / wprowadzić w pliku tekstowym?

18

Mam prosty plik tekstowy o nazwie „przykład”.

Odczytywanie za pomocą polecenia terminala: cat example

Wynik:

abc cdef ghi jk lmnopq rst uv wxyz

Chcę przekonwertować (przekształcić) w następującą postać: (oczekiwany wynik z cat example)

abc
cdef
ghi
jk
lmnopq
rst
uv
wxyz

Jak mogę to zrobić za pomocą wiersza polecenia?

(To tylko przykładowy plik, chcę przekonwertować pozycję słowa w kolumnie pionowej)

Pandya
źródło
Powiązane: unix.stackexchange.com/q/169995/85039
Sergiy Kolodyazhnyy

Odpowiedzi:

37

Kilka możliwości:

  1. Klasyk, użyj tr:

    tr ' ' '\n' < example
    
  2. Posługiwać się cut

    cut -d ' ' --output-delimiter=$'\n' -f 1- example
    
  3. Posługiwać się sed

    sed 's/ /\n/g' example
    
  4. Posługiwać się perl

    perl -pe 's/ /\n/g' example
    
  5. Użyj powłoki

    foo=$(cat example); echo -e ${foo// /\\n}
    
terdon
źródło
Na sedprzykład musiałem dodać a, $aby uzyskać bash i zastąpić go nową linią, tj .:sed $'s/ /\\\n/g' example
acumartini
sed $'s/ /\\n/g'
Powyższy
16

Wypróbuj poniższe polecenie

awk -v RS=" " '{print}' file

LUB

awk -v RS='[\n ]' '{print}' file

Przykład:

$ awk -v RS=" " '{print}' example
abc
cdef
ghi
jk
lmnopq
rst
uv
wxyz

Wyjaśnienie:

RS (Record seperator) jest wbudowaną zmienną awk. W pierwszym poleceniu wartość zmiennej zmiennej Separator rekordów to spacja. więc awk przerywa drukowanie linii, gdy tylko znajdzie miejsce.

W drugim poleceniu wartością zmiennej RS jest spacja lub znak nowej linii. To polecenie eliminuje dodatkową pustą linię pojawiającą się podczas uruchamiania pierwszego polecenia.

Avinash Raj
źródło
8

Można użyć xargs,

cat example | xargs -n 1

albo lepiej

xargs -n 1 < example
souravc
źródło
6
xargs -n 1 < exampleratuje 1 kotka
Rinzwind
2

Za pomocą perloneliner:

perl -p -i -e 's/\s/\n/g' example

Zastąpi spacje i tabulatory „ENTER” (alias \n)

Sylvain Pineau
źródło
1

Nikt nie wysłał pytona, więc oto:

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt 

Przekierowujemy plik wejściowy do pythonstrumienia standardowego i odczytujemy go wiersz po wierszu. Każda linia jest usuwana ze swojej nowej linii, dzielona na słowa, a następnie ponownie łączona w jeden ciąg, w którym każde słowo jest oddzielone nową linią. Ma to na celu zapewnienie jednego słowa w linii i uniknięcie wstawienia wielu nowych linii, w przypadku gdy obok spacji jest wiele spacji wzajemnie. W końcu otrzymujemy listę ciągów, która jest następnie ponownie łączona w większy ciąg i drukowana do standardowego strumienia. Później można przekierować do innego pliku z > out.txt przekierowaniem.

Sergiy Kolodyazhnyy
źródło
0

Podobne do powyższego „tr”, ale z dodatkami:

  • Działa również dla kart

  • Konwertuje wiele spacji lub tabulatorów na 1 znak nowej linii

    tr -s '[:space:]' '\n' < example
    
AstroTom
źródło