如果我有一个像这样的字符串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