Czy istnieje metoda drukowania wydruku wieloliniowego (pojedynczego wydruku) na tej samej linii?
Na przykład jeśli wynikiem jest:
abc
def
qwerty
Czy można wydrukować:
abcdefqwerty
command-line
scripts
text-processing
Shrinidhi Kulkarni
źródło
źródło
printf
+cat
+perl
jest znacznie lepiej obsługiwana przezperl -pe 's/\n//;END{printf "\n"}' input.txt
Pojedynczy proces, bez podstawiania poleceń i mieszania się z cudzysłowami oraz bez UUOC. Być może.Możesz przesyłać swoje wyjście multilinii
awk
lub użyj
sed
:Przykładowy przebieg
Dalsza lektura: usuń łamanie linii za pomocą AWK · serverfault.SE
źródło
Również,
your_command | paste -sd ''
który zachowuje końcowy znak nowej linii.źródło
Jeśli chcesz do tego użyć Perla, możesz użyć jego
chomp
funkcji:Więcej informacji dla zainteresowanych.
Jako kolejne argumenty możesz przekazać jedną lub więcej nazw plików.
W niektórych przypadkach możesz tego nie chcieć , ale zamiast tego możesz przesłać potokiem lub przekierować do tego polecenia. (Te umiejętności - i to zastrzeżenie - wszystkie odnoszą się również do każdego innego
perl -p
lubperl -n
opartego na rozwiązaniu rozwiązania).Jeśli więc chcesz przetworzyć dane wyjściowe z działania
some-command
:Jest to potencjalnie szybsze niż polecenie Perla w odpowiedzi terdona . Znaki nowej linii (reprezentowane przez
\n
) pojawiają się tylko na końcu linii w tej sytuacji - ponieważ są one tym, czego Perl używa do decydowania, gdzie kończy się każda linia.s/\n//
przeszukuje całą linię w poszukiwaniu nowych linii, achomp
po prostu usuwa tę na końcu (jeśli istnieje, ponieważ ostatnia linia może, ale nie musi).Wydajność może nie być głównym powodem preferowania
chomp
.perl
Polecenia w odpowiedzi terdon za byłyby tylko nieznacznie wolniej, chyba że jesteś przetwarzania ogromny plik z bardzo długich kolejkach. A jeśli potrzebujesz prędkości, droga Davida Foerstera jest prawdopodobnie prawdopodobnie szybsza.chomp
jest jednak dokładnie odpowiednim narzędziem do tego, jeśli używasz Perla, i myślę, że intencjachomp
jest wyraźniejsza niż w przypadkus/\n//
. Ostatecznie prawdopodobnie nie ma obiektywnej odpowiedzi na pytanie, która z nich jest lepsza.Drukowanie końcowej nowej linii.
Odradzam jednak stosowanie substytucji poleceń (
$(
)
) tylko po to, aby upewnić się, że drukowany jest znak nowej linii. O ile tekst, który przetwarzasz, nie jest krótki, jest to prawdopodobnie dość powolne - musi zebrać cały tekst na raz, a następnie wydrukować - i utrudnia zrozumienie twojego polecenia. Zamiast tego możesz zrobić, jak sugerował David Foerster, i pobiececho
lubprintf '\n'
później.Jeśli przesyłasz strumieniowo z lub (jak pokazuje David Foerster) przekierowując z tego polecenia, możesz je zawrzeć,
{
;}
aby dane wyjściowe obu poleceń zostały zebrane razem. Jeśli drukujesz go tylko na terminalu, możesz uruchomić go dokładnie tak, jak pokazano powyżej. Działa to nawet wtedy, gdy przesyłasz lub przekierowujesz do polecenia, ponieważecho
/printf '\n'
tak naprawdę nie czyta żadnych danych wejściowych. Oznacza to, że działa:Tutaj nie można po prostu usunąć
{
;}
:Lub, jeśli wolisz, możesz sam
perl
wydrukować ostatnią nową linię. Podobnie jak w przypadku dołączania poleceńperl
i , ta metoda działa nawet wtedy, gdy przepływasz lub przekierowujesz z niej (i, podobnie jak wszystkie podejścia, działa również, gdy do niej przepływasz):echo
{
;}
Zauważ, że polecenie w odpowiedzi terdona działa dobrze również z tymi metodami drukowania ostatniego znaku nowej linii. Na przykład:
źródło
perl -wpe 'chomp; END { print "\n" }
to ten sam proces, niewielka przewaga nad dodaniem echa końcowegoUżywając tylko powłoki:
źródło
Ta odpowiedź ma rozwiązanie problemu, który próbujesz stworzyć: Dlaczego bash usuwa \ n w $ (plik cat)?
Jeśli wpiszesz
cat myfile.txt
, zobaczysz:Ale jeśli wpiszesz
echo $(cat myfile.txt)
, zobaczysz:Zauważ, że ta metoda wstawia spację, w której kiedyś były oddzielne nowe linie. Dzięki temu wynik jest łatwiejszy do odczytania, ale nie ściśle odpowiada zakresowi pytań.
źródło
Jeśli korzystasz z Bash, możesz to zrobić bez zewnętrznego narzędzia.
Wynik:
Pierwsze polecenie przekształca wieloliniowe dane wyjściowe w tablicę, drugie polecenie rozszerza tablicę na wiele argumentów w jednym wierszu.
źródło