Regex Unix:按正则表达式分隔符剪切字符串
我有一个函数,可以打印出目录树中最长的路径。假设该函数打印以下内容:Regex Unix:按正则表达式分隔符剪切字符串,regex,string,bash,sed,cut,Regex,String,Bash,Sed,Cut,我有一个函数,可以打印出目录树中最长的路径。假设该函数打印以下内容:/.mozilla/firefox/z6upkljn.default/storage/permanent/chrome/idb/2918063365piupsah.files 我想做的是在与用户定义的正则表达式匹配之后剪切这个字符串 例如,如果用户输入regex,如:*de?a*,则唯一匹配项是z6upkljn.default。最后,输出将是/.mozilla/firefox 这是我找到的一个代码示例sed的/My_表达式.*/
/.mozilla/firefox/z6upkljn.default/storage/permanent/chrome/idb/2918063365piupsah.files
我想做的是在与用户定义的正则表达式匹配之后剪切这个字符串
例如,如果用户输入regex,如:*de?a*
,则唯一匹配项是z6upkljn.default
。最后,输出将是/.mozilla/firefox
这是我找到的一个代码示例sed的/My_表达式.*/'
其中My_表达式是用户定义的用于剪切的正则表达式和分隔符
它适用于这个输入$echo/homes/eva/xm/xmikfi00 | sed's/mik.*/'
,其中对于输出我得到/homes/eva/xm/x
。正如所料
但是如果我输入简单的正则表达式$echo/homes/eva/xm/xmifki00 | sed's/mi?*/'
,则输出是/homes/eva/xm/xmikfi00
。谁能帮助我获得与前一个示例相同的输出
我很乐意提供任何帮助或建议,谢谢。Sed使用(默认)POSIX BRE,而不是ERE。如果您试图匹配的?
是“任意字符”,请使用
:echo/homes/eva/xm/xmifki00 | sed's/mi..*/'
有关更多详细信息,请参见
man 7 re_格式
这里的定界规则是什么?定界是由用户定义的,可以扩展为regular expression.regex,如:*de?a*,唯一匹配的是z6upkljn.default。这里的规则是什么?任何与正则表达式*de?a*
*de?a*
匹配的东西都不是正则表达式,它是一个全局表达式,不能与sed一起使用。那么有什么可能的解决方案使它更友好吗?是的。使用sh、bash、perl、python等编写自己的代码,调用该语言的“glob”库。或者将glob翻译成正则表达式——这并不困难。也许你应该manbash
来了解globbing是如何工作的。是的,尽管它不是标准的。基于BSD的sed
s具有-E
选项,GNUsed
使用-r
。然而,这两种方法都不能使?
匹配任何字符;这不是POSIX正则表达式语法的任何一种风格的特征。正如上面提到的,您的示例确实是一个glob,而不是我熟悉的任何方言的正则表达式。