sed 将所有必要的 bash 转义插入文件路径

sed 将所有必要的 bash 转义插入文件路径

我正在寻找一个sed命令来将人类可读的文件或目录路径(如标准终端中显示的或由 输出find)更改为可用作 bash 参数*的命令,例如将字符串更改My Books/Pride & Prejudice.pdfMy\ Books/Pride\ \&\ Prejudice.pdf.

目前,我只是在\very 或空格之前插入一个&空格,但我想在各种边缘情况下都会出现这种情况。因此,我想知道是否存在更通用的解决方案。

*我意识到这个问题的最一般版本可能是不可能的 - 将路径作为参数传递以由任意程序(例如进一步的sed操作)处理可能需要每个程序的不同转义模型。但我只想直接使用输出作为路径,例如到cd那里或调用cat它们。

答案1

printf '%q\n' 'My Books/Pride & Prejudice.pdf'将给出您想要的输出。例如,您可以使用 glob 模式printf '%q\n' *来获取多个文件的结果。

根据您的用例,您可以使用find+exec组合而不需要转义。例如,find -type f -name '*.txt' -exec cat {} +将正确地将匹配的文件名传递给cat命令。

另一种选择是,如果您的文件名没有单引号和换行符等麻烦的字符,您可以手动用单引号将文件名括起来并将其传递给另一个命令。例如:ls -l 'My Books/Pride & Prejudice.pdf'

相关内容