Jeśli uruchomię polecenie cat file | grep pattern
, otrzymam wiele wierszy danych wyjściowych. Jak połączyć wszystkie wiersze w jeden wiersz, skutecznie zastępując każdy "\n"
z "\" "
(koniec ze "
spacją)?
cat file | grep pattern | xargs sed s/\n/ /g
nie działa dla mnie.
sed
skrypt w apostrofach, aby Bash z nim nie zadzierał (ponieważsed s/\n/ /g
wywołaniased
z dwoma argumentami, mianowicies/n/
i/g
); (2) Ponieważ chcesz wyjściecat file | grep pattern
za wejście dosed
, a nie argumenty dosed
, trzeba wyeliminowaćxargs
; i (3) nie ma takiej potrzebycat
, ponieważgrep
może przyjąć nazwę pliku jako drugi argument. Więc powinieneś był spróbowaćgrep pattern file | sed 's/\n/ /g'
. (W tym przypadku to by nie zadziałało, z powodów podanych w powyższym linku, ale teraz wiesz na przyszłość.)Odpowiedzi:
Służy
tr '\n' ' '
do tłumaczenia wszystkich znaków nowej linii na spacje:Uwaga:
grep
czyta pliki,cat
łączy pliki. Niecat file | grep
!Edytować:
tr
obsługuje tylko tłumaczenia pojedynczych znaków. Możesz użyćawk
do zmiany separatora rekordów wyjściowych, takich jak:To zmieniłoby:
do:
źródło
echo ""
na końcu, aby dodać nową linię przed tekstem zachęty."
, wygląda to takone" two" three"
, jak chciałbym, aby wyglądał jakone" two" three
. Zauważ, że ostatnie trzy nie mają nawiasów. Jakieś pomysły?sed '$s/..$//'
aby usunąć ostatnie 2 znaki z ostatniego wiersza.--delete
opcji, ponieważ domyślnie oczekuje dwóch argumentów. nptr --delete '\n'
.Wyjście potokiem do
xargs
spowoduje połączenie każdego wiersza wyjścia w jeden wiersz ze spacjami:Lub dowolne polecenie, np.
ls | xargs
. Domyślny limitxargs
wyjściowy to ~ 4096 znaków, ale można go zwiększyć np.xargs -s 8192
.grep xargs
źródło
| tr '\n' ' '
nie działał dla mnie, gdy został wywołany przezphp exec
funkcję. Ignorował tr i dawał tylko ostatni mecz od grepa.| xargs
pracował.W bash
echo
bez cudzysłowów usuń powrót karetki, tabulatory i wiele spacjiźródło
IFS="$(printf '\n\t')"
echo $(<file)
... używanie echa jest nie tylko ładniejsze niż używanietr '\n' ' '
, ale także lepsze (pomyśl o\r\n
zakończeniach linii). @aggsol, możesz po prostu powiedziećIFS=$'\n\t'
To może być to, czego chcesz
Co do twojej edycji, nie jestem pewien, co to oznacza, może to?
(przy założeniu, że
~
nie występuje wfile
)źródło
cat file
faktycznie będziecat
, a nawet plik. (I właśnie opuścił część niezmieniona, jak to było bez znaczenia dla kwestii)To jest przykład, który generuje dane wyjściowe oddzielone przecinkami. Możesz zastąpić przecinek dowolnym separatorem, którego potrzebujesz.
produkuje:
źródło
Oto metoda wykorzystująca
ex
edytor (część Vima ):J oin wszystkich liniach i p RINT do standardowe wyjście
J oin linie w miejscu (w pliku):
Uwaga: Spowoduje to konkatenację wszystkich wierszy wewnątrz pliku!
źródło
Najszybsze i najłatwiejsze sposoby rozwiązania tego problemu, jakie znam:
Kiedy chcemy zastąpić znak nowego wiersza
\n
spacją :xargs
ma własne ograniczenia dotyczące liczby znaków w linii i liczby wszystkich znaków łącznie, ale możemy je zwiększyć. Szczegóły można znaleźć uruchamiając to polecenie:xargs --show-limits
i oczywiście w instrukcji:man xargs
Kiedy chcemy zamienić jeden znak na inny, dokładnie jeden znak :
Gdy chcemy zamienić jeden znak na wiele znaków :
Najpierw zamieniamy znaki nowej linii
\n
na tyldy~
(lub wybieramy inny unikalny znak nieobecny w tekście), a następnie zastępujemy znaki tyldy dowolnymi innymi znakami (many_characters
) i robimy to dla każdej tyldy (flagig
).źródło
Prawdopodobnie najlepszym sposobem na to jest użycie narzędzia „awk”, które wygeneruje wynik w jednej linii
Spowoduje to scalenie wszystkich linii w jedną z ogranicznikiem spacji
źródło
{print}
ponieważ jest to domyślna akcja awk.Oto kolejna prosta metoda wykorzystująca
awk
:Ponadto, jeśli plik zawiera kolumny, daje to łatwy sposób na konkatenację tylko niektórych kolumn:
źródło
Na Linuksie Red Hat używam tylko echo:
echo $ (kot / jakiś / plik / nazwa)
To daje mi wszystkie rekordy pliku w jednej linii.
źródło