如何匹配行/文本末尾的模式

时间:2012-03-07 20:22:33

标签: bash sed

我对bash很新。所以,如果这是一个非常基本的问题,请原谅我。

我正在尝试将文件扩展名“.gzip”替换为“.gz”。

E.g:

testfile.xml.gzip => testfile.xml.gz

有人编写了一个脚本来执行此操作:

GZIP=`echo ${FILE} | grep .gz`

    .
    .
    .

FILE=`echo ${FILE} | sed 's/.gz//g'`

第一行错误地匹配testfile.xml.gzip文件。 grep .gz匹配文件名中介于两者之间的文本,而我需要它才匹配,只有它位于文件名的末尾。任何人都可以帮我解决这个问题吗?简而言之,我需要知道匹配模式行/文本末尾的表达式。

4 个答案:

答案 0 :(得分:13)

使用$匹配行尾:

FILE=`echo ${FILE} | sed 's/.gz$//g'`

无论如何,这个命令的作用是从文件名中删除尾随的.gz扩展名,根据你的问题,这不是你想要的。为此,dnsmkl的答案是使用sed的方法。

请注意,由于环境变量中已有FILE,因此您可以按如下方式使用bash string manipulation

$ FILE=textfile.xml.gzip
$ echo ${FILE/%gzip/zip}
textfile.xml.zip

答案 1 :(得分:7)

字符串的结尾与sed中的“$”匹配

例如

echo 'gzip.gzip' | sed  's|gzip$|gz|g'

输出

gzip.gz

答案 2 :(得分:0)

应该执行.gzip文件的while目录

(ls * .gzip | while read line; do mv“$ line”“$(basename”$ line“.gzip).gz”; done)

答案 3 :(得分:0)

This可能适合您:

rename gzip gz *gzip