【问题标题】:Changing file extensions with sed [duplicate]使用 sed 更改文件扩展名 [重复]
【发布时间】:2017-11-21 01:26:51
【问题描述】:

如果参数是文件,我想将它们的扩展名更改为.file

这就是我得到的:

#!/bin/bash

while [ $# -gt 0 ]
do
    if [ -f $1 ]
    then
       sed -i -e "s/\(.*\)\(\.\)\(.*\)/\1\2file" $1

    fi
    shift
done

脚本正在运行,但它不执行任何操作。另一个问题是文件没有任何扩展名,我的 sed 命令不起作用,对吧?请帮忙。

【问题讨论】:

  • 如果有的话,sed 旨在更改文件的内容,而不是它们的名称。您可以将它用于后者,但它几乎不是最好的工具。您的 sed 命令没有说明 sed 应该执行什么操作,我想您的脚本只是挂在该行上,对吧?
  • 是的,当我问这个问题时,我在 sed 命令后忘记了 $1。但无论如何它都不起作用。
  • 是的,因为该命令会更改文件的内容,而不是文件名。
  • 另外,我尝试了一个 : $1 mv $1.file 但它给了我 file.txt.file

标签: regex linux shell sed


【解决方案1】:

sed 用于操作文件的内容,而不是文件名本身。

选项1,取自this answer by John Smith

filename="file.ext1"
mv "${filename}" "${filename/%ext1/ext2}"

选项2,取自this answer by chooban

rename 's/\.ext/\.newext/' ./*.ext

选项3,取自this answer by David W.

$ find . -name "*.ext1" -print0 | while read -d $'\0' file
do
   mv $file "${file%.*}.ext2"
done

还有更多是here

更新:(在评论中询问 % 和 {} 在做什么?)

"${variable}other_chars" > 如果你想在字符串中扩展一个变量,你可以使用它。和%.* 中的%.* 意味着从值的尾部去掉模式.* 的变量值,例如如果你的变量是filename.txt "${variable%.*} 只返回filename

【讨论】:

  • 没有给出文件的扩展名。它可以是 .txt 或 .file 或任何东西。我希望脚本不关心这个。
  • 这没什么大不了的,你可以在选项 3 relpace "*.ext1""*.*" 中获取任何扩展名的文件名。
  • 泰,伙计。它正在工作。你能告诉我,请问 % 和 {} 在做什么?这是我第一次使用它们。
  • 我已编辑答案以更清楚地反映所有解决方案均来自现有答案。如果您认为现有答案是新问题的准确解决方案,则不应回答新问题,而应将其标记为与旧问题的重复。
  • @EduardAdrian 我更新了您问题的答案,希望对您有所帮助。
【解决方案2】:

使用 shell 函数包装 sed evaluate (e) 命令:

mvext () 
{ 
    ext="$1";
    while shift && [ "$1" ]; do
        sed 's/.*/mv -iv "&" "&/
             s/\(.*\)\.[^.]*$/\1/
             s/.*/&\.'"${ext}"'"/e' <<< "$1";
    done
}

测试,给定文件bahboo,扩展名应该是.file,然后改成.buzz

 mvext file bah boo
 mvext buzz b*.file

输出:

'bah' -> 'bah.file'
'boo' -> 'boo.file'
'bah.file' -> 'bah.buzz'
'boo.file' -> 'boo.buzz'

它是如何工作的:

  1. 第一个参数是文件扩展名,存储在$ext中。
  2. while 循环分别解析每个文件名,因为名称可能包含转义空格等。如果文件名确定没有这样的转义空格,while 循环可能可以避免。
  3. sed 读取标准输入,由bash here 字符串 &lt;&lt;&lt; "$1" 提供。
  4. sed 代码将每个名称 foo.bar(甚至只是简单的 foo)更改为字符串“mv -iv foo.bar foo.file" 然后使用 evaluate 命令运行该字符串。-iv 选项显示已移动的内容并提示现有文件是否可能被覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多