使用 bash 的参数扩展修剪命令行转义文件名

trimming command line escaped file names using bash's parameter extension

假设我得到了一个像

这样的命令

cp file1\ with\ escaped\ spaces file2\ with\ escaped\ spaces

此外,我想将此命令作为字符串处理,以使用参数扩展来收集具有 spaces 的文件名。实际上我可以通过转义获得正确的文件名。

但是考虑到以下代码片段,我无法获得左侧文件的完整文件名。

$ str="cp file1\ with\ escaped\ spaces file2\ with\ escaped\ spaces";

$ fr=${str##*[^\] }; echo ${fr}; # gets the rifght one
file2\ with\ escaped\ spaces

$ fl=${str#* }; echo ${fl%%[^\] *}; # the last expansion strips a `s`
file1\ with\ escaped\ space

当我尝试获取左侧文件时,我遇到了这个文件名的最低有效字符也被删除的问题。

我想知道是否可以使用 bash 的参数扩展收集命令字​​符串的左侧 space 转义文件名?

我想我很难找到正确的 reg exp,发现 space 不包含 \-前缀。

这是因为您混淆了正则表达式(由 grep 等人使用)和 glob 模式(由 shell 使用)。特别是,glob [^\] * 匹配 后跟单个 space 的非反斜杠,后跟零个或多个字符 。这正是 ${fl%%[^\] *} 剥离的内容。

转义转义序列让我删除正确的匹配项。

$ str="cp file1\ with\ escaped\ spaces file2\ with\ escaped\ spaces";

$ fr=${str##*[^\] }; echo ${fr}; # gets the rifght one
file2\ with\ escaped\ spaces

$ fl=${str#* }; echo ${fl// ${fr//\/\\}/};
file1\ with\ escaped\ spaces