【问题标题】:sed doesn't work from within bash scriptsed 在 bash 脚本中不起作用
【发布时间】:2011-09-04 12:06:32
【问题描述】:

我已经搜索了几个小时来寻找这个看似简单得令人沮丧的问题的答案......

我有一个 bash 脚本,我已对其进行了简化,以找到阻止它工作的行并留下:

#!/bin/bash
#
sed -i -e "s/<link>/\n/g" /usb/lenny/rss/tmp/rss.tmp

如果我运行这个脚本,文件 rss.tmp 不会发生任何事情 - 但如果我从终端调用这个完全相同的 sed 命令,它会按预期进行所有替换。

有人知道我在这里做错了什么吗?

【问题讨论】:

  • 我假设 bash 是你的交互式 shell,PATH 是相同的(所以你运行的是相同的 sed),等等?这个脚本对我来说很好......
  • 抱歉,我不确定如何检查 bash 是否是我的交互式 shell 或者 PATH 是否相同...应该承认这是我第一次尝试使用非常新的 sh 脚本这一切
  • 最后一个想法是使用#!/bin/sh -x#!/bin/bash -x 告诉shell 打印它正在执行的字符...嘿,我刚刚有了一个想法。您是否可能混淆了回车符和换行符,以至于注释开头的“#”也在消耗您的命令?
  • 尼莫,这与回车有关,所以感谢您指出我的方向!我一直在 Windows 下使用记事本++ 来编辑脚本,当我查看所有字符时,回车符都显示为cr/lf,所以我使用VI 全部更改了它们,脚本现在按预期工作:)
  • dos 格式,@Nemo 很聪明。下次你可以转换格式,dos2unix左右

标签: bash replace sed


【解决方案1】:

您需要提供一个输出文件,否则结果只会显示在屏幕上。

sed -e 's/<link>/\n/g' /usb/lenny/rss/tmp/rss.tmp > /usb/lenny/rss/tmp/output.tmp

【讨论】:

    【解决方案2】:

    尝试使用它:

    sed -i -e "s/\<link\>/\n/g" /usb/lenny/rss/tmp/rss.tmp
    

    【讨论】:

      【解决方案3】:

      根据讨论,这个问题听起来像是一个 cygwin shell 问题。 问题是 shell 脚本可能没有 \r\n 行终止 - 它们需要 \n 终止。早期版本的 cygwin 表现不同。 Cygwin FAQ 中的相关部分http://cs.nyu.edu/~yap/prog/cygwin/FAQs.html

      问:shell 脚本、.bashrc 等中的神秘错误 A: bash 读取时可能会收到神秘信息 您的 .bashrc 或 .bash_profile,例如 “\r 命令未找到” (或类似的)。当你摆脱空行时, 关于“\r”的抱怨消失了,但可能还有其他 错误仍然存​​在。到底是怎么回事? 答案可能在于一个文本文件(也 称为 ASCII 文件)可以有两种格式: DOS 格式或 UNIX 格式。 大多数编辑器可以自动检测格式 并以任何一种格式正常工作。 在 DOS 格式中,一个新行由两个字符表示: CR(回车或 ASCII 代码 13)和 LF(换行或 ASCII 代码 15)。 在 UNIX 格式中,新行仅由 一个字符,LF。当您的 .bashrc 文件被读取时, bash 认为多余的字符是命令的名称, 因此错误消息。 在 Cygwin 或 unix 中,您可以将文件 INFILE 转换为 DOS 格式 调用 Unix 格式的文件 OUTFILE: > tr -d '\15' 输出文件 笔记: 如果现在比较 INFILE 和 OUTFILE 中的字符数, 你会看到后者丢失了正确的 字符数(即 INFILE 中的行数): > wc INFILE 输出文件

      【讨论】:

      • 由于我只是将这个问题/答案链接为副本,我想补充一点,dos2unix 实用程序(可从 Cygwin 安装程序中获得)提供了一种舒适的方式来“杀死”DOS 回车一个文件,无需经过tr
      【解决方案4】:

      向使用“”创建文件,据我所知,sed 用作文本格式化程序而不是编辑器 也许这样的事情应该可以工作

      cat < /usb/lenny/rss/tmp/rss.tmp | sed -i -e "s/<link>/\n/g" > /usb/lenny/rss/tmp/rssedit.tmp
      

      cat 获取文件并使用 sed 对其进行编辑,然后输出到 rssedit.tmp

      检查 rssedit.tmp 是否有你想要的

      如果有且仅当有

      脚本的下一行 应该是

      mv /usb/lenny/rss/tmp/rssedit.tmp /usb/lenny/rss/tmp/rss.tmp 
      

      将把made 1替换为original,并重命名为original

      【讨论】:

      • 不,sed -i 修改文件。 Jamie 的问题是脚本在行尾有一个 CR,所以 sed 试图访问一个名为 rss.tmpCR 的文件。
      • glead 他修好了我写的东西是猫 /\n/g" > /usb/lenny/rss/tmp/rssedit.tmp 这样他就可以看到 rssedit.tmp 是否有他想要的更改,而不是将旧文件移动到新文件与 mv /usb/lenny/rss/tmp/rssedit.tmp /usb/lenny/rss/tmp/rss.tmp
      猜你喜欢
      • 2011-03-02
      • 1970-01-01
      • 2013-12-03
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      相关资源
      最近更新 更多