我知道我可以awk
用来解析多个分隔符,但这会产生子进程。我想知道是否可以进行复合/嵌套 bash 参数扩展。
我在名为“Px_MM-DD-YY_SSSSSSSSSS.pdf”的目录中有 PDF,其中:
- “Px”表示“第 x 页”,x 没有前导零。
- “MM”对应于两位数的月份,如果适用,前导零。
- “DD”对应于两位数的日期,如果适用,前导零。
- “YY”对应两位数的年份,如果适用,前导零。
- “SSSSSSSSSS”对应于创建 PDF 的十位纪元时间,这允许我保留 PDF 页面修订。
我有一个 for 循环(当我准备好对所有 PDF 进行操作时,我将删除“-mtime”)
for file in $(find -type f -iname '*_??????????.pdf' -mtime -1)
do
echo $file
done
我只想回显纪元时间。
我可以用这个for循环
for file in $(find -type f -iname '*_??????????.pdf' -mtime -1)
do
echo ${file##*_}
done
对于名为“./P14_07-21-18_4X_1532144458.pdf”的文件,“1532144458.pdf”会回显到屏幕上。
我可以用这个for循环
for file in $(find -type f -iname '*_??????????.pdf' -mtime -1)
do
echo ${file%.*}
done
对于名为“./P14_07-21-18_4X_1532144458.pdf”的文件,“./P14_07-21-18_4X_1532144458”会回显到屏幕上。
如果我用echo ...
以下任何格式替换该行
echo ${${file##*_}:0:10}
echo ${(${file##*_}):0:10}
echo ${${file##*_}%.*}
echo ${{file%.*}##_}
echo ${${file%.*}##_}
我明白了-bash: ... : bad substitution
。我的语法不正确还是嵌套/复合 bash 扩展是不可能的?
不能用最左边的变量执行嵌套替换。所以你可以做
${foo#$bar}
,但不是你展示的。如果您想在进一步的替换中使用它,请将替换的结果放入变量中。
如果不首先将初始结果保存到变量并对其应用第二次替换,则不能对另一个参数替换的结果进行参数替换。
您还循环了 的输出
find
,不推荐这样做。为循环提供结果的正确方法
find
是调用子 shell 并在其中执行循环:这样,您就不必担心实际的路径名是什么。Unix 中的文件名(即文件和目录以及其他文件类型的名称)可以包含除
/
and之外的任何字符\0
,例如空格和换行符。通过find
在find
. 因此,您的原始循环可能最终会遍历与您期望的完全不同的单词。有关的:
如果我理解正确,使用 Awk 的问题是您为每个 PDF 文件调用一个 Awk 进程(我假设您有大量这些文件)。
你可以按照以下方式运行一些东西
或者,如果您保持结构:
(当然,用任何 Awk、sed、Python 等价物替换 Perl 命令)
(如果您有机会尝试这种方法,请告诉我们
time ....
获得的结果)