Jak mogę usunąć znak nowej linii w bash?

7

Czasami kopiuję i wklejam ścieżki do terminala, a często przypadkowo kopiuję znak nowej linii. Na przykład chcę znaleźć, a następnie przeczytać zawartość foobar.txt.

$ locate foobar.txt
/home/sparhawk/Document Directory/foobar.txt

Następnie wybieram drugą linię potrójnym kliknięciem. (Ups, zaznacza także końcowy znak nowej linii!) Ponieważ na ścieżce jest spacja, muszę zawrzeć ścieżkę w cudzysłowie. Stąd wpisz

$ cat '

i kliknij środkowym przyciskiem, aby wkleić. To produkuje

$ cat '/home/sparhawk/Document Directory/foobar.txt
> 

ponieważ wstawiłem nowy wiersz przed zamknięciem '. W tym momencie nie mogę nacisnąć klawisza Backspace, aby usunąć nowy wiersz. Czy istnieje sposób na usunięcie tej właśnie wpisanej nowej linii?

Więcej informacji

W tym momencie mogę albo SIGINTz Ctrl+ c, albo uzupełnić cytat innym '. Powiedzmy, że robię to drugie.

$ cat '/home/sparhawk/Document Directory/foobar.txt
> '
cat: /home/sparhawk/Document Directory/foobar.txt
: No such file or directory

co ma sens, ponieważ właśnie wpisałem ścieżkę z nową linią. Jednak w tym momencie mogę nacisnąć strzałkę w górę, aby załadować ostatnie polecenie. to znaczy

$ cat '/home/sparhawk/Document Directory/foobar.txt
'

W tym momencie mogę nacisnąć dwukrotnie klawisz Backspace, aby usunąć nowy wiersz. (Uwaga: nie ma >drugiego przykładu z historii).

Krogulec
źródło

Odpowiedzi:

6

Bash korzysta z biblioteki GNU Readline do wprowadzania i edycji z wiersza poleceń. Niestety ta biblioteka przetwarza dane wejściowe tylko wiersz po wierszu. readline()Wywołanie zwraca po zakończeniu wiersza przez naciśnięcie Enter. Następny wiersz (po wyświetleniu monitu $PS2>”) jest przetwarzany przez osobne readline()wywołanie.

Gdy wrócisz do historii edycji do wprowadzania wieloliniowego, Readline traktuje dane wejściowe jako pojedynczą „linię” z nowymi liniami ( $PS2monity nie są wyświetlane), dzięki czemu możesz edytować całą linię wieloliniową zgodnie z opisem.

Używam następującej sztuczki, aby rozwiązać przedstawiony przez ciebie problem: Kiedy wprowadzam niechcianą nową linię, anuluję ją, naciskając Ctrl+ c. Następnie wracam do anulowanego wejścia, naciskając (lub Ctrl+ p). Następnie mogę usunąć nowy wiersz Backspacei wprowadzić inne zmiany.

Wpisz na końcu niechciany znak nowej linii, naciskając Ctrl+ c:

$ cat 'xyz
> ^C

Po naciśnięciu wejścia zwraca zdarzenie bez końcowego znaku nowej linii:

$ cat 'xyz
pabouk
źródło
1
Tak, też natknąłem się na to obejście. To prawdopodobnie najczystszy sposób na pokonanie tego. +1 za referencje i pokazanie, że obejście jest jedynym rozwiązaniem.
Sparhawk