Bash 如何匹配行/文本末尾的图案

Bash 如何匹配行/文本末尾的图案,bash,sed,Bash,Sed,我对bash很陌生。如果这是一个非常基本的问题,请原谅 我正在尝试将文件扩展名“.gzip”替换为“.gz” 例如: 有人编写了这样一个脚本: GZIP=`echo ${FILE} | grep .gz` . . . FILE=`echo ${FILE} | sed 's/.gz//g'` 第一行错误地匹配了testfile.xml.gzipfile。grep.gz匹配文件名中介于两者之间的文本,而我只需要在文件名末尾匹配它。有人能帮我纠正这个问题吗?简而言之,我需

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

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

例如:

有人编写了这样一个脚本:

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

    .
    .
    .

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

第一行错误地匹配了
testfile.xml.gzip
file。
grep.gz
匹配文件名中介于两者之间的文本,而我只需要在文件名末尾匹配它。有人能帮我纠正这个问题吗?简而言之,我需要知道与行尾/文本匹配的表达式。

使用
$
匹配行尾:

FILE=`echo ${FILE} | sed 's/.gz$//g'`
无论如何,这个命令所做的是从文件名中删除尾随的
.gz
扩展名,根据您的问题,这不是您要查找的扩展名。为此,dnsmkl的答案是使用
sed

请注意,由于环境变量中已有
文件
,因此可以按如下方式使用bash:

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

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

比如说

echo 'gzip.gzip' | sed  's|gzip$|gz|g'
输出为

gzip.gz
应该在.gzip文件目录下运行一段时间 (ls*.gzip |在读行时;执行mv“$line”“$(basename“$line”.gzip).gz”完成)

可能适合您:

rename gzip gz *gzip

学习POSIX BRE的ane-ERE:-)注意
\r\n
Windows新行。您的匹配模式虽然通常足够,但并非100%正确,因为它还会将
foobargz
等文件名转换为
fooba
,如果您希望它与点完全匹配,则需要在
之前添加
,否则,图案中的任何点都将匹配任何字符。或者,如果你不关心点,那么最好不要把它们放在模式中,因为它是令人困惑的。
rename gzip gz *gzip