文本文件(版权)的内容如下。
gems/1.8/gems/fxri-0.3.6/fxri-0.3.6.tar.gz/fxri-0.3.6.tar/lib/Icon_Loader.rb
misc/common/groovy/groovy-src-1.7.0.tar.gz/groovy-1.7.0.tar/src/examples/swing/RegexCoach.groovy
......还有更多这样的文件路径
我想将以 tar.gz 结尾的文件名替换为空空间。预期的:
gems/1.8/gems/fxri-0.3.6/fxri-0.3.6.tar/lib/Icon_Loader.rb
misc/common/groovy/groovy-1.7.0.tar/src/examples/swing/RegexCoach.groovy
这不起作用:
sed -i -e 's/*.tar.gz//g' copyright
需要帮忙。
答案1
作为一个全局,*.tar.gz
表示任何以 结尾的字符串.tar.gz
。然而,Sed 确实不是使用球体, 它用常用表达和正则表达式有不同的语法。尝试:
sed -i -e 's/\/[^/]*\.tar\.gz//g' copyright
在上面,正则表达式\/
匹配以/
(因为/
被用作sed
分隔符,我们将其转义为\/
)开头的任何内容,后跟[^/]*
匹配零个或多个除 之外的任何字符/
,后跟被转义的.tar.gz
位置.
,以便它们仅匹配句点。 (在正常的正则表达式表示法中,.
匹配任何一个字符。)
glob(由 shell 使用)和正则表达式(由 sed、grep 和其他重要工具使用)之间存在许多差异。在 glob 中,.
表示句点。在正则表达式中,.
是一个通配符,表示任何单个字符。在 glob 中,*
表示零个或多个任意字符。在正则表达式中,*
意味着零个或多个前一件事的。
进阶话题
我们不必/
在 sed 替代命令中用作分隔符。其他分隔符也是可能的,例如@
:
sed -i -e 's@/[^/]*\.tar\.gz@@g' copyright
因为在上面,我们使用@
代替 来作为除数/
,所以我们不需要转义第一个/
。