2009-10-24 18 views
11

mam wzoru jak poniżejJak zastąpić znaki nowej linii znakami tabulatora?

hi 
hello 
hallo 
greetings 
salutations 
no more hello for you 

próbuję zastąpić wszystkie znaki nowej linii z karty za pomocą następującego polecenia

sed -e "s_/\n_/\t_g" 

ale to nie działa.

Czy ktoś mógłby pomóc? Szukam rozwiązania w sed/awk.

Odpowiedz

11
nie

pewni wyjścia chcesz

# awk -vRS="\n" -vORS="\t" '1' file 
hi  hello hallo greetings  salutations  no more hello for you 
32

Tutaj tr jest lepszy, myślę:

tr "\n" "\t" < newlines 

Jak Nifle sugerowane w komentarzu, newlines tu jest nazwa pliku sprawującego oryginalny tekst.

Ponieważ linia sed jest zorientowana liniowo, jest bardziej skomplikowana w takim przypadku.

+1

+1 Pokonaj mnie przez 40 sekund – Nifle

+0

@Nifle: Także nie ma tu "kota", ale kto się liczy? :) – Telemachus

+0

Może chcieć wskazać, że "nowe linie" to plik tekstowy – Nifle

5

Nie można zastąpić newlines na zasadzie wiersz po wierszu z sed. Musisz gromadzić linie i zastępować nowe linie między.

text abc\n <- can't replace this one 

text abc\ntext def\n <- you can replace the one after "abc" but not the one at the end 

Ten sed skrypt gromadzi wszystkie linie i eliminuje wszystkie nowe linie ale ostatni:

sed -n '1{x;d};${H;x;s/\n/\t/g;p};{H}' 

Nawiasem mówiąc, Twój sed skrypt sed -e "s_/\n_/\t_g" próbuje powiedzieć „zastąpić wszystkie ukośniki następnie nowej linii z ukośnice, a następnie tabulatory ". Podkreślenia przejmują rolę ograniczników dla polecenia s, dzięki czemu ukośniki mogą być łatwiej używane jako znaki do wyszukiwania i zastępowania.

6
sed '$!{:a;N;s/\n/\t/;ta}' file 
+1

czy mógłbyś również wyjaśnić komendę, której używasz? – Vijay

+0

jeśli nie jest to ostatnia linia, połącz następną linię z odstępem między wzorami, zamień znak nowej linii, a następnie przejdź do: a i wykonaj to samo dla każdej linii – ghostdog74

1
paste -s 

-s Łączy wszystkie linie każdego oddzielnego pliku wejściowego w linii poleceń kolejności. Znak nowej linii każdej linii, z wyjątkiem ostatniego wiersza w każdym pliku wejściowym, jest zastępowany znakiem tabulacji , chyba że opcja -d określa inaczej.

0

Jesteś prawie tam z sed skryptu, to po prostu trzeba go zmienić na:

sed -e "s/\n/\t/g" 

\ wystarczy do ucieczki, nie ma potrzeby, aby dodać _ i trzeba dodaj / przed końcem g, aby sed dowiedział się, że jest to ostatnia część skryptu.

Powiązane problemy