假设 gawk
变量 fpath
包含带有扩展名的完整文件路径,即 tmp/myfile.txt
。但是,此文件扩展名可以是任何文件扩展名。如何使用 gensub
仅返回文件扩展名? gensub
here 上有一个文档页面。
答案 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
语句。哎呀,不需要正则表达式。