【问题标题】:sed command not changing textsed 命令不更改文本
【发布时间】:2018-10-07 14:35:06
【问题描述】:

我正在尝试找出一种自动更改版本号的方法,为此我有一个脚本会尝试读取文件然后对其进行更改。

\\ students.txt
this is a text, text is not so bad, and more text

我在同一个目录中有students.txt 和changetext.sh 文件。

\\ changetext.sh
sed -i='' "s/, /- /g" students.txt

当我在带有 Windows 10 的 Windows64 位系统上的 Cygwin 上运行此命令时,它在控制台上运行良好。但是当我尝试从上面显示的 shell 脚本运行这个命令时,它会给出以下错误。

$ ./changetext.sh
: No such file or directoryt

我不确定是什么问题?有人可以指导我吗?

【问题讨论】:

  • 尝试更改脚本,使其显示“./students.txt”而不是“students.txt”,看看是否有所不同。
  • 我也试过了,但它仍然抛出同样的错误。我相信有些东西与第一个单引号字符串有关,或者有些问题与 64 位系统上的 cygwin 相关。不确定。我是 cygwin 的新手
  • 当它说“没有这样的文件或目录”时,它还说什么? IE。什么是完整的错误行?它可能还会说“bash: ./changetxt.sh”或“sed: can't read students.txt”
  • 哦,这就是它所说的。这实际上是我复制的 cygwin 控制台输出。我会正确地重新格式化它。
  • 一个空白的“没有这样的文件”可能意味着它认为它正在寻找一个不可见的字符和/或该行格式错误。我将你所有的脚本复制到我的终端并运行它们,它工作得很好,所以这里的语法很好。您可以将这些复制到不同的目录中,看看它是否也适合您。您是使用剪贴板直接将它们复制到这篇文章中,还是手动重新输入它们?

标签: ubuntu sed cygwin


【解决方案1】:

我的 Cygwin 副本(在 Win10 下大约 6 个月大)上出现了不同的行为,但是您对 -i 的使用不正确。
你想要 "-i[SPACE]" 那当然不是 [SPACE] 而是文字空间。它正在尝试为您的使用添加= 后缀。它可能对您系统上的 '' 的解释也与我的不同。

啊....如果我在 Windows 目录中,我会收到错误消息。我相信它尝试生成作为备份文件的任何文件名对于 Cygwin 都是合法的,但对于 Windows 则不合法。

如果您想要备份文件,请使用 -i~-i.bak 或类似的内容。

您的脚本的另一个潜在问题是缺少一个 shebang 来指定应该使用哪个 shell 来解释它。 -i='' 的奇怪之处很可能也被不同的 shell 以不同的方式解释。 bash shebang 是典型的:

What is the preferred Bash shebang?

【讨论】:

  • 感谢 zzxyz 的回复和更多信息。是的,我发现了,但即使我在-i 之后添加空格,它的工作原理也相似。我只是粘贴了该代码,因为我从互联网上得到它并想修改它,并且在搜索过程中我还发现了有关备份的信息,但我并没有为更改后缀而烦恼。
【解决方案2】:

好的,我找到了答案。我认为这是 Cygwin 的问题,因为我在 ubuntu OS 上尝试了相同的脚本,它工作得非常好。

我不确定这个问题,但如果我错了,有人可以纠正我。我在 Ubuntu 16.04 上尝试过,它可以工作,但它在带有 Cygwin 的 Windows 10 上不起作用。

【讨论】:

  • 我认为您认为这是 Cygwin 问题是错误的。我刚刚在 Cygwin 下尝试过它,它按预期工作。 “正如预期的那样”意味着第一个 ',' 被替换为 '-' 字符,并以名称 students.txt= 进行了文件备份。请注意,后者是您要求的:-i='' 等同于 '-i=,即,使用后缀“=”备份原始文件。而且,是的,您绝对应该添加一个shebang;在这种情况下,#!/bin/sh 是合适的。
  • 抱歉,应该是:-i='' 等价于-i=
猜你喜欢
  • 1970-01-01
  • 2015-04-16
  • 2021-12-18
  • 2021-04-28
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2017-08-23
相关资源
最近更新 更多