使用 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
假设我得到了一个像
这样的命令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