如何使用 gawk 的 gensub 捕获文件扩展名?

时间:2021-06-02 05:43:13

标签: awk

假设 gawk 变量 fpath 包含带有扩展名的完整文件路径,即 tmp/myfile.txt。但是,此文件扩展名可以是任何文件扩展名。如何使用 gensub 仅返回文件扩展名? gensub here 上有一个文档页面。

5 个答案:

答案 0 :(得分:2)

看起来你有 shell 变量,你可以简单地通过设置适当的字段分隔符来做到这一点,如下所示。只需将字段分隔符设置为 . 并在此处打印最后一个字段值。

echo "tmp/myfile.txt" | awk -F'.' '{print $NF}'

答案 1 :(得分:2)

如果 $fpath 是一个 shell 变量,您想将其值传递给 awk,我建议使用 shell 功能。例如,使用 bash:

$ f='tmp/myfile.txt'
$ echo "${f##*.}"
txt

$ f='tmp/myfile.txt.abc'
$ echo "${f##*.}"
abc

##*. 将删除到字符串中的最后一个 .。如果您还需要 ".${f##*.}",请使用 .。有关详细信息,请参阅 Parameter Expansion

答案 2 :(得分:2)

如果您必须以任何价格使用 gensub,请按以下步骤操作:

awk 'BEGIN{fpath="tmp/myfile.txt";print gensub(/.*\./, "", 1, fpath)}' emptyfile.txt

输出

txt

请注意,此解决方案将删除直到 . 为止的所有内容,因此对于 tmp/myfile.tar.gz,您将获得 gz

(在 gawk 4.2.1 中测试)

答案 3 :(得分:2)

一个简单的 awk,删除最后一个点之前的所有内容:

awk '{sub(/^.*\./, "")} 1' <<< 'tmp/myfile.txt'
txt

awk '{sub(/^.*\./, "")} 1' <<< 'tmp/folder/myfile.csv'
csv

或类似的sed

sed 's/.*\.//' <<< /folder/myfile.csv
csv

答案 4 :(得分:0)

你可以进一步破解 awk NF :

g/mawk -F. '$0=$NF'

因为我不关心用 FS 替换 OFS,所以直接覆盖整个行 $0,只是扩展名 $NF

我还在 { } 之外编写了它们,这意味着在该分配之后,将直接打印扩展名。

只有一个小的缺点是,如果目录/文件夹已经通过管道输入,它们也会被打印出来,并且没有像典型 README 这样的扩展名的文件将逐字打印完整的文件名。

无需调用 sub()gsub()index()match()gensub(),甚至 print 语句。哎呀,不需要正则表达式。

相关问题