让我假设我得到了一个像
这样的命令 cp file1\ with\ escaped\ spaces file2\ with\ escaped\ 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的参数扩展收集命令字符串的左空间转义文件名?
我想我发现正确的reg exp找不到包含\
- 前缀的空格。
答案 0 :(得分:1)
这是因为你把regexp(由grep等人使用)与glob模式(shell使用)混淆了。特别是,glob [^\\] *
匹配一个非反斜杠后跟一个空格,后跟零个或多个字符。这正是${fl%%[^\\] *}
剥离的。
答案 1 :(得分:0)
转义转义序列可以删除正确的匹配。
$ 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