【问题标题】:How to match pattern at the end of line/text如何在行/文本的末尾匹配模式
【发布时间】:2015-11-19 14:57:42
【问题描述】:

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

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

例如:

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

有人编写了这样的脚本:

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

    .
    .
    .

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

第一行错误地匹配testfile.xml.gzip 文件。 grep .gz 匹配文件名中介于两者之间的文本,而我需要它仅在文件名末尾匹配。谁能帮我解决这个问题?简而言之,我需要知道与行/文本结尾的模式匹配的表达式。

【问题讨论】:

  • 学习 POSIX BRE 的一个 ERE :-) 注意\r\n Windows 换行符。

标签: bash sed


【解决方案1】:

使用$匹配行尾:

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

【讨论】:

  • 您的匹配模式虽然通常可能已经足够了,但并不是 100% 正确,因为它还会将像 foobargz 这样的文件名转换为 fooba,您需要在 @987654331 之前添加 \ @ 如果您希望它从字面上匹配 dot,否则模式中的任何点都将匹配任何字符。或者,如果您不关心点,那么最好将它们排除在模式之外,因为它确实令人困惑。
  • g 标志似乎有点多余?
【解决方案2】:

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

例如

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

输出是

gzip.gz

【讨论】:

    【解决方案3】:

    应该做一段时间的 .gzip 文件目录

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

    【讨论】:

      【解决方案4】:

      This 可能对你有用:

      rename gzip gz *gzip
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多