这种 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中的ispell .mwl文件中提取所有前缀词