如何在 bash 中删除刚刚输入的换行符?

Spa*_*awk 9 linux terminal bash shell command-line

我有时将路径复制粘贴到终端中,并且经常不小心复制换行符。例如,我想查找然后阅读foobar.txt.

$ locate foobar.txt
/home/sparhawk/Document Directory/foobar.txt
Run Code Online (Sandbox Code Playgroud)

然后我点击三次选择第二行。(糟糕,它也选择了尾随的换行符!)由于路径中有空格,我需要用引号将路径括起来。因此输入

$ cat '
Run Code Online (Sandbox Code Playgroud)

并单击鼠标中键进行粘贴。这产生

$ cat '/home/sparhawk/Document Directory/foobar.txt
> 
Run Code Online (Sandbox Code Playgroud)

因为我在关闭'. 此时,我无法按退格键删除换行符。有没有办法删除这个刚刚输入的换行符?

更多信息

在这一点上,我可以SIGINT使用Ctrl+ c,也可以使用另一个'. 假设我做后者。

$ cat '/home/sparhawk/Document Directory/foobar.txt
> '
cat: /home/sparhawk/Document Directory/foobar.txt
: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为我刚刚输入了一个包含换行符的路径。但是,此时,我可以按向上箭头来加载最后一个命令。IE

$ cat '/home/sparhawk/Document Directory/foobar.txt
'
Run Code Online (Sandbox Code Playgroud)

此时,我可以按两次退格键删除换行符。(注意>,在第二个历史示例中没有。)

pab*_*ouk 7

Bash 使用GNU Readline 库进行命令行输入和编辑。不幸的是,这个库只逐行处理输入。readline()按 完成该行后,呼叫将返回Enter。下一行(在显示$PS2>”提示后)由单独的readline()调用处理。

当您在编辑历史记录中返回多行输入时,Readline 将输入视为带有换行符的单个“行”($PS2不显示提示),因此您可以按照您的描述编辑整个多行输入。

我使用以下技巧来解决您提出的问题:当我输入不需要的换行符时,我按Ctrl+取消它c。然后我按?(或Ctrl+ p)返回到取消的输入。然后我可以删除换行符Backspace并进行其他编辑。

在末尾输入不需要的换行符,按Ctrl+ c

$ cat 'xyz
> ^C
Run Code Online (Sandbox Code Playgroud)

?没有尾随换行符的情况下按下输入返回事件后:

$ cat 'xyz
Run Code Online (Sandbox Code Playgroud)