告诉正则表达式在匹配之前跳过行的开头

告诉正则表达式在匹配之前跳过行的开头

如果我有一个像这样的字符串45mb ./aaaa/bbbb/cccc/dddd,并且我使用像这样的正则表达式,[^\/]*\/它将匹配45mb ./aaaa/bbbb/cccc/

我只想让它匹配./aaaa/bbbb/cccc/,但我不知道该怎么做。

我想专门匹配/查找所有出现的“正斜杠之前的所有内容,直到并包括斜杠”,因为我想用它来sed替换下面命令中的匹配项sed,但不会在开始时丢失文件大小位。

sed -e 's/[^\/]*\//--/g

希望这是有道理的。我尝试向前/向后看,但我不知道这是否是正确的正则表达式解决方案。

答案1

既然您在对 Gnouc 答案的评论中阐明了您想要的内容,那么这里有一个解决方案:

sed 's|[^ /]*/|--|g'

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | sed 's|[^ /]*/|--|g'
45mb --------dddd

如果您有尾部斜杠,或者您传递给它的文件路径包含任何空格,这将会中断。编写一些更无懈可击的脚本非常容易,但它涉及的不仅仅是一行。


这是使用捕获组的一种解决方案:

sed -e 's|\([^ ]* \).*/\(.*\)|\1\2|'

我使用|s 作为分隔符,因为这样我就不必费心转义正斜杠(但我必须转义|模式中的任何 s)。 AFAIKsed几乎可以使用任何字符作为分隔符。

第一个捕获组\([^ ]* \)匹配“除空格之外的任意数量的任意字符,后跟空格”。匹配.*/“任意数量的任意字符,后跟正斜杠”,第二组\(.*\)捕获“任意数量的任意字符”。

Sed 的正则表达式(以及大多数正则表达式)默认是贪婪的,因此.*/将匹配与其模式匹配的最长字符串。

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | sed 's|\([^ ]* \).*/\(.*\)|\1\2|'
45mb dddd

但是,如果尾部有斜杠,则会中断:

$ echo '45mb ./aaaa/bbbb/cccc/dddd/' | sed 's|\([^ ]* \).*/\(.*\)|\1\2|'
45mb 

这个版本将要即使有尾部斜线也能工作,但如果有多个斜线就会中断:

sed -e 's|\([^ ]* \).*/\(.\)|\1\2|'

$ echo '45mb ./aaaa/bbbb/cccc/dddd/' | sed 's|\([^ ]* \).*/\(.\)|\1\2|'
45mb dddd/
$ echo '45mb ./aaaa/bbbb/cccc/dddd//' | sed 's|\([^ ]* \).*/\(.\)|\1\2|'
45mb /

答案2

这是使用正则表达式和 perl 的解决方案:

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | perl -ne 'print $1 if /(\.\/.*\/)/'
./aaaa/bbbb/cccc/    

和替换:

$ echo '45mb ./aaaa/bbbb/cccc/dddd' | perl -ple 's/(\.\/.*\/)/--/'
45mb --dddd

相关内容