Używam od sed
dłuższego czasu, ale oto dziwactwo, z którym się spotkałem, którego nie jestem w stanie rozwiązać.
Pozwól mi wyjaśnić mój problem z faktyczną sprawą.
Scena 1
printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard
W pierwszym poleceniu printf
przesyłam potokiem dane wyjściowe, aby zostały xclip
skopiowane do schowka. Teraz printf
inaczej niż echo
domyślnie nie wstawia nowej linii. Tak więc, jeśli wkleję tę zawartość do terminala, ls
skopiowane polecenie nie uruchomi się automatycznie.
W drugim jest nowy wiersz na końcu, więc wklejenie zawartości schowka powoduje również uruchomienie polecenia w schowku.
To jest dla mnie niepożądane. Tak więc chciałem usunąć nowy wiersz za pomocą sed
, ale nie udało się, jak wyjaśniono w poniższej scenie.
Scena # 2
echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard
Treść w schowku nadal zawiera nową linię. Kiedy wkleję go do terminala, polecenie uruchamia się automatycznie.
Próbowałem także usunąć znak powrotu karetki \r
. Ale nada. Wygląda na to, że brakuje mi czegoś bardzo ważnego / podstawowego.
generate-text | xclip
przypadku niepożądanych . Ta odpowiedź usuwa tylko ostatnią nową linię.Wiele narzędzi do przetwarzania tekstu, w tym sed, działa na zawartości linii, z wyjątkiem znaku nowej linii. Pierwszą rzeczą, jaką robi sed podczas przetwarzania linii, jest usunięcie nowej linii na końcu, a następnie wykonanie poleceń w skrypcie i dodanie końcowej nowej linii podczas drukowania. Więc nie będziesz w stanie usunąć nowej linii za pomocą sed.
Aby usunąć wszystkie nowe wiersze, możesz
tr
zamiast tego użyć :źródło
Możesz zastąpić znaki nowej linii w sed, przekazując mu opcję -z .
Strona podręcznika użytkownika Sed:
źródło
| xclip
przypadku.Jeśli po prostu wstawiasz polecenia do schowka
Jeśli dodatkowo musisz wykonać bardziej złożone transformacje,
źródło
perl
ipython
oba są znacznie wolniejsze niżsed
może być, gdy są używane poprawnie. Kluczem jest jednak umiejętność prawidłowego korzystania z niego.sed
mogą zrobić znacznie więcej niż obsłużyć tylko jedno linijki i prawdopodobnie może to zrobić szybciej niż jakiekolwiek inne wspomniane narzędzia.Aby usunąć tylko ostatnią nową linię , przeciągnij przez:
sed
nie doda\0
końca do tego strumienia, jeśli ogranicznik jest ustawiony naNUL
via-z
, natomiast aby utworzyć plik tekstowy POSIX (zdefiniowany jako koniec a\n
), zawsze będzie wyświetlał końcowy\n
bez-z
.Na przykład:
I aby udowodnić, że nie
NUL
dodano:Aby usunąć wiele końcowych znaków nowej linii , przeciągnij przez:
źródło