Jak mogę zastąpić spacje nowymi wierszami na danych wejściowych, takimi jak:
/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5
itp...
Aby uzyskać następujące informacje:
/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5
Uwaga
Zadaję to pytanie, aby pomóc innym użytkownikom. Znalezienie użytecznej odpowiedzi w UNIX SE nie było łatwe, dopóki nie zacząłem pisać tego pytania. Potem znalazłem następujące:
Powiązane pytanie
bash
text-processing
string
laconbass
źródło
źródło
Odpowiedzi:
Użyj
tr
poleceniaZnalezione na http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html
źródło
tr
!W takim przypadku użyłbym printf:
Jeśli w jednej ze ścieżek znajdują się spacje , możesz zacytować tę ścieżkę pliku, aby zapobiec jej podziałowi na spacje:
Przekształcanie tekstu
tr
jest najlepszym rozwiązaniem, o czym mowa w istniejącej odpowiedzi.źródło
Zakładając, że masz ciąg znaków ze spacjami jako separatorami:
Jednak prawdopodobnie zadajesz złe pytanie. (Niekoniecznie, na przykład może pojawić się w pliku makefile). Rozdzielona spacjami lista nazw plików tak naprawdę nie działa: co jeśli jedna z nazw plików zawiera spacje?
Jeśli program otrzymuje nazwy plików jako argumenty, nie łącz ich ze spacjami. Użyj,
"$@"
aby uzyskać do nich dostęp jeden po drugim. Chociażecho "$@"
drukuje argumenty ze spacjami pomiędzy nimi, wynika to zecho
: drukuje argumenty ze spacjami jako separatory.somecommand "$@"
przekazuje nazwy plików jako osobne argumenty do polecenia. Jeśli chcesz wydrukować argumenty w osobnych wierszach, możesz użyćJeśli masz nazwy plików rozdzielone spacjami i chcesz umieścić je w tablicy, aby nad nimi pracować, możesz użyć niecytowanego rozszerzenia zmiennej, aby podzielić wartość na znaki
IFS
(musisz wyłączyć interpretację symboli wieloznacznych za pomocąset -f
, w przeciwnym razie glob wzory zostaną rozszerzone o wartość):Możesz zawrzeć to w funkcji, która przywraca
-f
ustawienie i wartość,IFS
kiedy to nastąpi:źródło
set -f
iwIFS
instrukcji bash, jeśli chcesz wszystkie szczegóły. Zobacz także unix.stackexchange.com/questions/16192/…IFS
lokalne nie ma zastosowaniaBądź pragmatyczny, użyj sed !!
Powyższe mówi, aby zastąpić jeden lub więcej białych znaków (\ s +) znakiem nowej linii (\ n)
To mniej więcej:
źródło
Jako alternatywę dla
tr
@laconbass możesz również użyćxargs
w tym przypadku:Zaletą jest to, że działa nawet z wieloma białymi spacjami, co
tr
nie działa.źródło
Oto jak to zrobiłem:
Zwróć uwagę na użycie klawisza Enter po ukośniku odwrotnym w
sed
poleceniu.źródło
sed
ponadtr
?sed
ponieważ jest to edytor niż zwykłe tłumaczenie znaków.sed
może zrobić o wiele więcej, ale jest to całkowicie przesada.tr
jest właściwym narzędziem do tej pracy, ale wiedzased
i wyrażenia regularne z pewnością przydadzą się później!Inne podejście, zakładając, że linia znajduje się w zmiennej o nazwie
line
:Wykorzystuje to fakt, że Bash domyślnie dzieli argumenty na białe znaki i domyślnie
echo
dołącza nowy wiersz do swoich danych wejściowych.źródło
to kolejna metoda zamiany słów oddzielonych spacją na separację nowego wiersza.
źródło
Poniższy skrypt jest łatwy do zrozumienia i łatwy w użyciu.
źródło
tr
) jest taka sama jak w zaakceptowanej odpowiedzi. Poza tym twoja odpowiedź ma następujące problemy: a) polecenie nie jest wcięte 4 spacjami (-> układ znaczników) b) Twoje użyciecat
jest bezużyteczne (możesz je zastąpić< filename tr ' ' '\n'
). c) Twoja wyjściowa nazwa pliku jest taka sama jak wejściowa nazwa pliku. Dzięki temu tworzysz wyścig danych.