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

Bhu*_*han 7 bash sed

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

我正在尝试.gzip用' .gz' 替换文件扩展名' '.

例如:

testfile.xml.gzip => testfile.xml.gz
Run Code Online (Sandbox Code Playgroud)

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

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

    .
    .
    .

FILE=`echo ${FILE} | sed 's/.gz//g'`
Run Code Online (Sandbox Code Playgroud)

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

jco*_*ado 13

使用$该行的末尾匹配:

FILE=`echo ${FILE} | sed 's/.gz$//g'`
Run Code Online (Sandbox Code Playgroud)

无论如何,这个命令的作用是.gz从文件名中删除尾随扩展名,根据你的问题,这不是你想要的.要做到这一点,dnsmkl的答案是顺便说一句sed.

请注意,由于您已经拥有FILE环境变量,因此可以使用bash 字符串操作,如下所示:

$ FILE=textfile.xml.gzip
$ echo ${FILE/%gzip/zip}
textfile.xml.zip
Run Code Online (Sandbox Code Playgroud)

  • 你的匹配模式虽然可能通常已经足够了,但它不是100%正确,因为它也会将文件名像`foobargz`变成`fooba`,你需要在`.`之前添加`\`如果你希望它真的匹配_dot_,否则模式中的任何点都将匹配任何字符.或者,如果你不关心点,那么也许最好将它们排除在模式之外,因为它实际上是令人困惑的. (3认同)

dns*_*mkl 7

字符串的结尾在sed中与"$"匹配

例如

echo 'gzip.gzip' | sed  's|gzip$|gz|g'
Run Code Online (Sandbox Code Playgroud)

输出是

gzip.gz
Run Code Online (Sandbox Code Playgroud)