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

发布于 2024-12-05 10:33:40 字数 429 浏览 1 评论 0原文

我正在研究一些与转换文件相关的东西,并且我正在尝试找到一个 shell 命令来删除原始文件扩展名。 例如,如果我转换一个名为 text.rtf 的文件,它将被转换为 text.rtf.mobi。我想使用一些东西来删除 .rtf(或任何其他扩展名),这样它就只是 text.mobi

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

有点相关的是,我应该在哪里获取正则表达式并真正理解它,而不是仅仅进行大量的谷歌搜索?谢谢。

编辑:我在原来的帖子中有点不清楚,所以让我澄清一下。我需要的 shell 命令是用于删除转换后的文件中的原始扩展名,例如 text.ANYTHING.mobi。很抱歉造成混乱。

I'm working on some stuff related to converting files, and I'm trying to find a shell command to remove the original file extension.
For example, if I convert a file called text.rtf, it will be converted into text.rtf.mobi. I'd like to use something to remove the .rtf (or any other extension) so it's only text.mobi.

I've been playing with awk and sed but I couldn't get anything to work. I'm not sure how to get it to pick up both the original extension and the .mobi, but only remove the original extension.

Somewhat related, where should I be going to pick up regex and actually understand it instead of just immense amounts of Googling? Thanks.

EDIT: I was a little unclear in the original post so let me clarify. The shell command I need is for removing the original extension in a converted file, such as text.ANYTHING.mobi. Sorry about the confusion.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

最美不过初阳 2024-12-12 10:33:40

经典的方法是 basename 命令:

file="text.rtf"
new=$(basename "$file" .rtf).mobi

更现代的方法避免使用其他程序:

file="text.rtf"
new="${file%.rtf}.mobi"

如果您确实必须使用 awk,那么我想您使用:

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

For sed< /code>,您使用:

file="text.rtf"
new=$(echo "$file" | sed 's/\.rtf$/.mobi/')

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


要将 text.rtf.mobi 转换为 text.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/')

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

不再有一个明智的方法来使用 basename 来做到这一点。

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

The classic way is the basename command:

file="text.rtf"
new=$(basename "$file" .rtf).mobi

The more modern way avoids exercising other programs:

file="text.rtf"
new="${file%.rtf}.mobi"

If you really must use awk, then I suppose you use:

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

For sed, you use:

file="text.rtf"
new=$(echo "$file" | sed 's/\.rtf$/.mobi/')

For a really good explanation of regular expressions, then you want Friedl's "Mastering Regular Expressions" book.


To convert text.rtf.mobi to text.mobi, you can use any of the tools previously shown with minor adaptations:

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/')

And things are only marginally different if the .rtf can be any other extension, but you start to ask yourself "why doesn't he remove the original extension from the file before converting it, or use the file naming facilities in the converter to get the required output name?"

There is no longer a sensible way to do it with basename.

new="${file/.[!.]*.mobi/}"    # bash
new=$(echo "$file" | awk '/\.[^.]+\.mobi$/ { sub(\.[^.]*\.mobi$/, ".mobi"); } { print }')
new=$(echo "$file" | sed 's/\.[^.]*\.mobi$/.mobi/')
南渊 2024-12-12 10:33:40

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

$ x=something.whatever.mobi
$ echo ${x%%.*}.mobi
something.mobi

Just remove all the extensions and then add back in .mobi

$ x=something.whatever.mobi
$ echo ${x%%.*}.mobi
something.mobi
陈独秀 2024-12-12 10:33:40

下面是一个使用 xargs 和 basename 从文件名中去除 .wav 的示例,以便使用 lame 将波形文件批量转换为 mp3

: xargs -I % 基本名称 % ".wav" | xargs -I $ lame --tl Xenologix --ta Drøn --tg IDM --tt $ $.wav $.mp3

Here's an example using xargs and basename to strip .wav from file names for batch conversion of wave files into mp3s using lame:

/bin/ls | xargs -I % basename % ".wav" | xargs -I $ lame --tl Xenologix --ta Drøn --tg IDM --tt $ $.wav $.mp3

赢得她心 2024-12-12 10:33:40
for f in *.mobi
  do
    mv $f $(echo $f | cut -d'.' -f1).mobi
  done
for f in *.mobi
  do
    mv $f $(echo $f | cut -d'.' -f1).mobi
  done
夜声 2024-12-12 10:33:40
for f in *.mobi
do
mv $f `echo $f|awk -F"." '{print $1"."$3}'`
done
for f in *.mobi
do
mv $f `echo $f|awk -F"." '{print $1"."$3}'`
done
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文