【问题标题】:trimming command line escaped file names using bash's parameter extension使用 bash 的参数扩展名修剪命令行转义文件名
【发布时间】:2015-03-27 20:19:40
【问题描述】:

假设我有一个类似的命令

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

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

但是考虑到以下 sn-p,我无法获得左侧文件的完整文件名。

$ 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 找到不包含 \-prefix 的空间。

【问题讨论】:

  • 为什么这个命令需要在字符串中?
  • @EtanReisner 我希望能够处理传递给脚本的关于带有转义字符的文件名的命令字符串。我只是希望“命令”看起来像在纯 shell 上运行命令时显示的那样。 atm 不一定是命令。请专注于我坚持的转义/正则表达式/修剪。
  • 在字符串中嵌入复杂的命令是有问题的,甚至无法正确执行。这就是我问的。详情请见mywiki.wooledge.org/BashFAQ/050
  • @EtanReisner 感谢您指出这一点。无论如何,我通过替换正确的字符串转义文件名(s.b.)找到了一个奇怪的解决方案。

标签: regex bash expansion


【解决方案1】:

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

【讨论】:

  • 那么如果我想将最长的后缀修剪为非反斜杠空格会是什么样子?换句话说,我怎样才能找回我的s? :)
  • 我不想破坏自己解决问题的满足感。看来你成功了。那感觉如何? :-)
  • 谢谢。至少这是一个解决方案。感觉就像用飞机循环飞行。两次。 :) 也许有一种方法可以在参数扩展中使用特定的 reg exp,但目前你确定我很满意。记住我,如果你有类似的东西,请告诉我。
【解决方案2】:

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

$ 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

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2022-07-26
    • 2017-01-21
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多