正则表达式排除查找工具的单词

时间:2016-08-09 13:32:27

标签: regex linux bash find regex-lookarounds

我尝试使用find util查找文件,我想查找所有*.js - 除特殊目录中的文件之外的文件。我试着用命令找到:

find ./ -regex '\.((?\!node_modules).)*\.js'

但这种情况一无所获。

这个正则表达式适用于Sublime Text 3,我在那里测试过它。

P.S。我知道用下面的其他选项解决。但我想知道如何用正则表达式解决问题

find ./ -path *node_modules -prune -o -name *.js

2 个答案:

答案 0 :(得分:2)

目前你不能这样做。

GNU Find支持几种正则表达式类型,但它们都不支持零宽度断言。

ID_AFSTAND:

            <asp:Label ID="ID_AFSTANDLabel" runat="server" DataSourceId="dtsrcAFstandKilometer" Text='<%# Bind("AFSTAND") %>' DataValueField="ID_AFSTAND" DataTextField="AFSTAND" AppendDataBoundItems="true"  />
            <asp:ObjectDataSource ID="dtsrcAFstandKilometer" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetDataAfstand" TypeName="InschrijvenTableAdapters.tblAfstandenTableAdapter"></asp:ObjectDataSource>
            <br />

对于你的任务,你需要一个lookbehind断言, 它尚不支持。

另一个选择是使用find2perl将查找表达式转换为perl程序, 这与表达式相同。

您可以使用此程序检查您的表达式是否适用于PCRE和预见/后置断言。

答案 1 :(得分:1)

您的find实施的正则表达式引擎似乎并不支持环视。 (请参阅man find,您可能会找到@IgorChubin解释的内容。)

您仍然可以使用! -regex排除不需要的模式,例如:

find . ! -regex '\./node_modules/.*' -name '*.js'