sed不';不能在bash脚本中工作

sed不';不能在bash脚本中工作,bash,replace,sed,Bash,Replace,Sed,我已经找了几个小时来寻找这个问题的答案,这个问题似乎简单得令人沮丧 我有一个bash脚本,我已经对它进行了简化,以找到阻止它工作的行,剩下的是: #!/bin/bash # sed -i -e "s/<link>/\n/g" /usb/lenny/rss/tmp/rss.tmp #/bin/bash # sed-i-e“s//\n/g”/usb/lenny/rss/tmp/rss.tmp 如果我运行这个脚本,文件rss.tmp将不会发生任何变化——但是如果我从终端调用完全相同的s

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

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

#!/bin/bash
#
sed -i -e "s/<link>/\n/g" /usb/lenny/rss/tmp/rss.tmp
#/bin/bash
#
sed-i-e“s//\n/g”/usb/lenny/rss/tmp/rss.tmp
如果我运行这个脚本,文件rss.tmp将不会发生任何变化——但是如果我从终端调用完全相同的sed命令,它将按照预期进行所有替换


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

将文件提供给您使用的命令“”,就我所知,sed用作文本格式化程序而不是编辑器 也许像这样的事情应该管用

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

它将用original替换made 1,并将其重命名为original,根据讨论,该问题听起来像是cygwin外壳问题。 问题是shell脚本可能没有\r\n行终止-它们需要\r\n行终止。cygwin的早期版本表现不同。 Cygwin常见问题解答的相关部分

问:shell脚本、.bashrc等中的神秘错误 答:当bash阅读时,你可能会收到一些神秘的信息 您的.bashrc或.bash_配置文件,例如 “\r找不到命令” (或类似)。当您去掉空行时 有关“\r”的投诉消失,但可能是其他投诉 错误依然存在。发生了什么事? 答案可能在于,文本文件(也 称为ASCII文件)可以有两种格式: DOS格式或UNIX格式。 大多数编辑器可以自动检测格式 并且在两种格式中都能正常工作。 在DOS格式中,新行由两个字符表示: CR(回车或ASCII码13)和LF(换行或ASCII码15)。 在UNIX格式中,新行仅由 一个字符,左前。读取.bashrc文件时, bash认为额外的字符是命令名, 因此出现了错误消息。 在Cygwin或unix中,可以将文件内嵌转换为DOS格式 通过调用以下命令以Unix格式创建文件输出文件: >tr-d'\15'输出文件 注: 如果现在比较填充文件和输出文件中的字符数, 您将看到后者丢失了正确的 字符数(即填充中的行数): >wc填充式排水管
试着用它来代替:

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

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

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

我假设bash是您的交互式shell,路径是相同的(因此您运行的是相同的
sed
),等等?这个脚本对我来说很好…抱歉,我不知道如何检查bash是我的交互式shell还是路径相同。。。我应该承认,这是我第一次尝试使用sh脚本,对所有这些都很陌生。最后一个想法是使用
#/bin/sh-x
#/bin/bash-x
告诉shell打印它正在执行的字符。。。嘿,我刚有个主意。您是否可能混淆了回车符和换行符,以至于开始注释的“#”也占用了您的命令?尼莫,这与回车符有关,因此感谢您为我指明了方向!我一直在windows下使用记事本++编辑脚本,当我查看所有字符时,回车符显示为
cr/lf
,因此我使用
VI
更改了所有字符,脚本现在按预期工作:)dos格式,@Nemo是智能的。下次您可以转换格式时,dos2unix或soNo,
sed-i
会就地修改文件。Jamie的问题是,脚本的末尾有一个CR,因此
sed
试图访问一个名为
rss.tmpCR
的文件。glead他修复了它,我写的是cat/usb/lenny/rss/tmp/rssedit.tmp,这样他就可以查看rssedit.tmp是否有他想要的更改,而不是使用mv/usb/lenny/rss/tmp/rssedit.tmp/usb/lenny/rss/tmp/rss.tmp将旧文件移到新文件,因为我刚刚将这个问题/答案链接为一个副本,我想添加
dos2unix
实用程序(可从Cygwin安装程序获得)提供了一种轻松的方法来“杀死”文件中的DOS回车,而无需通过
tr
sed -i -e "s/\<link\>/\n/g" /usb/lenny/rss/tmp/rss.tmp
sed -e 's/<link>/\n/g' /usb/lenny/rss/tmp/rss.tmp > /usb/lenny/rss/tmp/output.tmp