这种 bash 文件名提取技术的用途?

Posted

技术标签:

【中文标题】这种 bash 文件名提取技术的用途?【英文标题】:Uses for this bash filename extraction technique? 【发布时间】:2010-10-07 00:19:38 【问题描述】:

我有一部分 bash 脚本正在获取不带扩展名的文件名,但我试图了解这里真正发生了什么。 “%%”是干什么用的?有人可以详细说明 bash 在幕后做什么吗?如何普遍使用这种技术?

#!/bin/bash

for src in *.tif
    do
    txt=$src%%.*
    tesseract $src $txt
    done

【问题讨论】:

请注意 %% 将删除所有的 '.'在文件名中,而不仅仅是所谓的扩展名。例如,如果你有 hello.world.tif 和 hello.death.tif,两者都会让 tesseract 将它们发送到同一个目的地,你好。如果您只想删除扩展名,请使用 %。 因为在文件名中有多个“.”的情况下要搜索并从字符串的右侧去掉“最短匹配模式”。我感觉合理。所以在我上面的脚本的情况下,我应该把它改成“%”。这应该去除文件扩展名。 【参考方案1】:

查看 bash 手册页中的“参数扩展”。该语法扩展了 $src 变量,从中删除了与 .* 模式匹配的内容。

【讨论】:

谢谢,我没有意识到 bash 手册页如此广泛。【参考方案2】:

它去掉了文件扩展名(这里.tif),示例:

$ for A in test.py test.sh test.xml test.xsl; do echo "$A: $A%%.*"; done
test.py: test
test.sh: test
test.xml: test
test.xsl: test

来自 bash 手册:

   $parameter%%word
          The word is expanded to produce a pattern just as in pathname expansion.  If the
          pattern matches a trailing portion of the expanded value of parameter, then  the
          result  of  the  expansion  is the expanded value of parameter with the shortest
          matching pattern (the ``%'' case) or the longest matching  pattern  (the  ``%%''
          case) deleted.  If parameter is @ or *, the pattern removal operation is applied
          to each positional parameter in turn, and the expansion is the  resultant  list.
          If  parameter  is an array variable subscripted with @ or *, the pattern removal
          operation is applied to each member of the array in turn, and the  expansion  is
          the resultant list.

【讨论】:

从您的示例中,我可以开始从命令行看到 bash 的强大功能。谢谢!【参考方案3】:

这是 bash 手册页的输出

 $parameter%%word
          The word is expanded to produce a pattern just  as  in  pathname
          expansion.   If  the  pattern  matches a trailing portion of the
          expanded value of parameter, then the result of the expansion is
          the  expanded value of parameter with the shortest matching pat-
          tern (the ``%'' case)  or  the  longest  matching  pattern  (the
          ``%%''  case)  deleted.   If  parameter  is  @ or *, the pattern
          removal operation is applied to  each  positional  parameter  in
          turn,  and the expansion is the resultant list.  If parameter is
          an array variable subscripted with @ or *, the  pattern  removal
          operation  is  applied  to each member of the array in turn, and
          the expansion is the resultant list.

【讨论】:

【参考方案4】:

这是一个字符串移除操作,格式为:$str%%substr

其中 str 是您正在操作的字符串,substr 是要匹配的模式。它在 str 中查找 substr 的最长匹配,并从该点删除所有内容。

【讨论】:

【参考方案5】:

显然 bash 有几个“参数扩展”工具,其中包括:

只需替换值...

$parameter

扩展为子字符串...

$parameter:offset
$parameter:offset:length

代入参数值的长度...

$#parameter

扩展参数开头的匹配...

$parameter#word
$parameter##word

在参数末尾展开匹配...

$parameter%word
$parameter%%word

扩展参数以查找和替换字符串...

$parameter/pattern/string

这些是我认为我从手册页的这一部分理解的部分的解释。如果我错过了重要的事情,请告诉我。

【讨论】:

请注意# 和## 以及% 和%% 之间存在细微差别。这些扩展也不理解文件名。

以上是关于这种 bash 文件名提取技术的用途?的主要内容,如果未能解决你的问题,请参考以下文章

使用 bash 脚本提取 tar 文件

仅提取特定文件名然后将其用于变量的 Bash 脚本

在 bash/sed/awk 中提取文件的最后一个单词

如何从bash中的ispell .mwl文件中提取所有前缀词

使用 bash (sed/awk) 提取 CSV 文件中的行和列?

在 Bash 中提取子字符串