使用Awk删除多个文件扩展名之一?

Kri*_*ian 1 regex shell awk sed

我正在处理与转换文件有关的一些事情,我正在尝试找到一个shell命令来删除原始文件扩展名.例如,如果我转换一个名为的文件text.rtf,它将被转换为text.rtf.mobi.我想使用一些东西来删除.rtf(或任何其他扩展名),所以它只是text.mobi.

我一直在玩awk和sed,但我无法得到任何工作.我不知道如何让它同时获取原始扩展名和.mobi,但只删除原始扩展名.

有点相关,我应该去哪里拿起正则表达式并实际理解它而不仅仅是大量的谷歌搜索?谢谢.

编辑:我在原帖中有点不清楚所以让我澄清一下.我需要的shell命令是删除转换文件中的原始扩展名,例如text.ANYTHING.mobi.对此感到抱歉.

Jon*_*ler 7

经典的方式是basename命令:

file="text.rtf"
new=$(basename "$file" .rtf).mobi
Run Code Online (Sandbox Code Playgroud)

更现代的方法是避免执行其他程序:

file="text.rtf"
new="${file%.rtf}.mobi"
Run Code Online (Sandbox Code Playgroud)

如果你真的必须使用awk,那么我想你使用:

file="text.rtf"
new=$(echo "$file" | awk '/\.rtf$/ { sub(/\.rtf$/, ".mobi"); } { print }')
Run Code Online (Sandbox Code Playgroud)

对于sed,您使用:

file="text.rtf"
new=$(echo "$file" | sed 's/\.rtf$/.mobi/')
Run Code Online (Sandbox Code Playgroud)

对于正则表达式的真正很好的解释,那么您需要 Friedl 的“掌握正则表达式”一书。


要转换text.rtf.mobitext.mobi,您可以使用之前显示的任何工具,并稍作修改:

new=$(basename "$file" .rtf.mobi).mobi
new="${file%.rtf.mobi}.mobi"
new=$(echo "$file" | awk '/\.rtf\.mobi$/ { sub(/\.rtf\.mobi$/, ".mobi"); } { print }')
new=$(echo "$file" | sed 's/\.rtf\.mobi$/.mobi/')
Run Code Online (Sandbox Code Playgroud)

如果.rtf可以是任何其他扩展名,情况只会略有不同,但是您开始问自己“为什么他不在转换之前从文件中删除原始扩展名,或者使用转换器中的文件命名工具来获取所需的扩展名输出名称?”

不再有明智的方法来使用basename.

new="${file/.[!.]*.mobi/}"    # bash
new=$(echo "$file" | awk '/\.[^.]+\.mobi$/ { sub(\.[^.]*\.mobi$/, ".mobi"); } { print }')
new=$(echo "$file" | sed 's/\.[^.]*\.mobi$/.mobi/')
Run Code Online (Sandbox Code Playgroud)


Dig*_*oss 6

只需删除所有扩展,然后重新添加 .mobi

$ x=something.whatever.mobi
$ echo ${x%%.*}.mobi
something.mobi
Run Code Online (Sandbox Code Playgroud)