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

时间:2015-01-28 19:19:49

标签: regex bash expansion

让我假设我得到了一个像

这样的命令

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找不到包含\ - 前缀的空格。

2 个答案:

答案 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