【问题标题】:Sed gives: sed: can't read : No such file or directorysed 给出:sed:无法读取:没有这样的文件或目录
【发布时间】:2017-08-27 13:16:53
【问题描述】:

我有以下bash 脚本,它对找到的每个图像重复。它需要遍历所有 htmlcssjs 文件,并替换该文件中所有出现的图像。

 for image in app/www/images-theme-dark/*.png
    do
        echo "installing icon" $image

        # extract filename from iconpath
        iconfile=$(basename $image)
        iconPath="images/"$(basename $image)

        # replace paths in all files containing icon paths
        find app/www -type f \( -name "*.html" -or -name "*.css" -or -name "*.js" \
                            -or -name "*.appcache" \)  \
            -exec sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}" \;

    done

但是,当我运行脚本 sed 时:

sed: can't read : No such file or directory

在 StackOverflow 上我找到了 sed: can't read : No such file or directory 但我已经在 {} 周围引用了引号

当我回显sed 命令并在命令行上手动执行时,没有错误。

我在 Raspbian GNU/Linux 8.0 (jessie) 上使用 GNU sed v4.2.2

有人知道这里有什么问题吗?

【问题讨论】:

  • sed -i 后面的 '' 是什么?
  • 请在您的问题中添加操作系统和 sed 版本。
  • @osi:-i 的语法是 GNU sed 和 mac os 中的 sed 之间的区别之一。
  • @osi:-i表示in-place,即直接在文件中编辑。 -i '' 表示就地编辑名称为空字符串的文件。由于您可能实际上没有名称为空字符串的文件,sed 抱怨它无法读取它。

标签: bash sed quoting gnu-sed


【解决方案1】:

编译来自 cmets 的答案,诀窍是 melpomene 和 AlexP。

sed -i 后面的 '' 是什么?

-i表示就地,即直接在文件中编辑。
-i ''表示就地编辑名称为空字符串的文件。
由于可能没有名称为空字符串的文件,sed 抱怨它无法读取它。

注意 1 平台依赖性
-i 的语法是 GNU sed 和 mac os 中的 sed 之间的区别之一。

注 2 “通常”的参数顺序
指示 sed 代码的 -e 开关允许将其放在文件名之间。
这是一个陷阱(例如,我被困在其中,令人尴尬),使您超出了对 sed 命令行中找到的内容的期望。
它允许
sed -i filename -e "expression" AnotherFileName
这是
sed -i'NoExtensionGiven' "expression" filename AnotherFileName 的无意伪装版本。

【讨论】:

    【解决方案2】:

    为了同时支持 OSX 和 Linux,我使用一个简单的 if 检查来查看 bash 脚本是在 OSX 还是 Linux 上运行,并据此调整命令的 -i 参数。

    if [[ "$OSTYPE" == "darwin"* ]]; then
      sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
    else
      sed -i -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
    fi
    

    【讨论】:

    • Linux 命名法在 Windows 上也适用于 msys。感谢您的提示酸性。
    【解决方案3】:

    在我的 bash 脚本中,我使用了类似的东西(支持 MacOS 和 Linux 发行版):

    SEDOPTION=
    if [[ "$OSTYPE" == "darwin"* ]]; then
      SEDOPTION="-i ''"
    fi
    
    sed $SEDOPTION "/^*/d" ./file
    

    【讨论】:

    • 请解释这在现有答案之上提供的额外见解,尤其是@Acidic9 的答案。我看不到您的答案与那个答案之间的功能差异。此外,“我使用类似这样的东西”没有对这个只有代码的答案提供任何解释。简而言之,请让您的贡献更加明显,以避免给人一种抄袭的印象,并且在功能上几乎不相关地进行了更改。
    • storenth 的答案更便携,并且随着您使用的 sed 命令越多变得越来越好,尽管我需要非 macOS 的 -i 选项。也就是说,这个解决方案在我的 macOS 上有一个奇怪的怪癖,它在文件名中附加了 $SEDOPTION 的引号。我不得不求助于以下黑客来防止这种情况......我尝试了许多其他的东西,比如管道 xargs、交换单引号和双引号、反引号等,但这对我有用(\x27 代表单引号): if [[ "$OSTYPE" == "darwin"* ]]; then SEDOPTION='-i \x27\x27'; else SEDOPTION='-i'; fi;
    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 2022-01-08
    • 2018-08-14
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2021-11-24
    相关资源
    最近更新 更多