Regex 正则表达式:如何在Bash函数的最后一个/之前删除所有内容?

Regex 正则表达式:如何在Bash函数的最后一个/之前删除所有内容?,regex,bash,.bash-profile,Regex,Bash,.bash Profile,我有一个bash函数,它接受一个param,通过jslint运行它,然后将结果输出到桌面上的一个文件中。只要您在运行JS文件时位于该文件的目录中,它就可以工作。但是,如果您向函数传递一条路径,它将阻塞。jslint是我的函数名。示例: # This works $ jslint script.js # This doesn't work $ jslint ~/dev/project/js/script.js # Neither does this $ jslint /Users/Jesse/

我有一个bash函数,它接受一个param,通过jslint运行它,然后将结果输出到桌面上的一个文件中。只要您在运行JS文件时位于该文件的目录中,它就可以工作。但是,如果您向函数传递一条路径,它将阻塞。jslint是我的函数名。示例:

# This works
$ jslint script.js

# This doesn't work
$ jslint ~/dev/project/js/script.js

# Neither does this
$ jslint /Users/Jesse/dev/project/js/script.js
在我的函数中,我需要取$1并在输出路径时修剪路径,最好使用正则表达式。请参见下面的我的功能:

function jslint {
    /usr/local/bin/node /usr/share/node-jslint/node_modules/jslint/bin/jslint.js $1 > "~/Desktop/" + $1 + "-lint.txt"
}
下面是我正在处理并试图在其上运行的项目的示例错误:


-bash:/Users/Jesse/Desktop/Dropbox/dev/ourcityourstory.com/js/script.js-lint.txt:没有这样的文件或目录

而不是
regex
-basename,它从文件路径参数的最后一个“/”输出字符串

e.g. basename /usr/include/stdio.h  --> stdio.h

你不需要正则表达式。Bash支持简单的glob模式来修剪前缀/后缀。这可以通过
${1##*/}
完成,它将所有内容修剪到变量的最后一个
/

具体而言,有4种变体:

  • ${var#pat}
    pat
    视为全局,并从
    var
    中修剪最短的匹配前缀

  • ${var##pat}
    pat
    视为全局,并从
    var
    中修剪最长的匹配前缀

  • ${var%pat}
    pat
    视为全局变量,并从
    var
    中修剪最短的匹配后缀

  • ${var%%pat}
    pat
    视为全局变量,并从
    var
    中修剪最长的匹配后缀

  • 在你的具体情况下,你可能会想说

    function jslint {
        /usr/local/bin/node /usr/share/node-jslint/node_modules/jslint/bin/jslint.js "$1" > "~/Desktop/" + "${1##*/}" + "-lint.txt"
    }
    

    (我还引用了这个变量,如果路径包含空格,这是必需的)

    Re:“最好使用正则表达式”:您能解释一下您选择这个选项的原因吗?除非您有一个强大的,否则使用
    “$(basename“$1”)”
    “${1##*/}”
    似乎更容易。这些只是示例。错误是一个真实的应用程序。它们都说明了问题是$1被附加到我要输出lint结果的路径上,我想显示在桌面上。如果$1只是一个js文件,它就可以工作。但是如果它是一个路径,它就不起作用,因为函数试图将结果输出到~/Desktop/some/non/existence/path/script.js。这不适用于这个特定的问题,但是我看到人们使用${var%%pat}替换dirname,当变量不包含/s(dirname返回。在这种情况下,${var%%pat pat}保持值不变)。