我已经搜索了数小时,寻找这个看似令人沮丧的简单问题的答案...
我有一个bash脚本,我已经简化了它以查找阻止它工作的那一行,现在只剩下:
#!/bin/bash
#
sed -i -e "s/<link>/\n/g" /usb/lenny/rss/tmp/rss.tmp
如果我运行这个脚本,对于文件rss.tmp没有任何变化-但是如果我从终端调用完全相同的sed命令,它会按预期进行所有替换。有人知道我在这里做错了什么吗?
根据讨论,问题似乎是一个cygwin shell的问题。 问题在于shell脚本可能没有\r\n行终止符-它们需要\n终止符。早期版本的cygwin行为不同。 来自Cygwin FAQ的相关部分:http://cs.nyu.edu/~yap/prog/cygwin/FAQs.html
Q: shell脚本、.bashrc等出现神秘错误dos2unix
实用程序(可以从Cygwin安装中获取)提供了一种舒适的方式来“杀死”文件中的DOS回车符,而无需经过tr
的操作。 - DevSolar试着使用那个代替:
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
将文件传递给命令需要使用"<",而创建文件则需要使用">",据我所知sed通常用作文本格式化工具而非编辑器。也许可以尝试以下方式:
cat < /usb/lenny/rss/tmp/rss.tmp | sed -i -e "s/<link>/\n/g" > /usb/lenny/rss/tmp/rssedit.tmp
猫获取文件并使用sed编辑,输出到rssedit.tmp
然后检查rssedit.tmp是否包含所需内容
仅当它包含所需内容时
你的脚本的下一行应该是
mv /usb/lenny/rss/tmp/rssedit.tmp /usb/lenny/rss/tmp/rss.tmp
这将用重命名为original替换made 1,并将其更名为original
sed -i
是直接修改文件。Jamie 的问题是脚本在行末有一个 CR,所以 sed
尝试访问一个名为 rss.tmpCR
的文件。 - Gilles 'SO- stop being evil'
sed
),等等?这个脚本对我来说很好用... - Nemoecho $SHELL
应该会告诉你你的交互式 shell 是什么。 如果是 bash,请尝试在交互式 shell 和脚本中运行type -a sed
,查看它们是否相同。(或者直接使用/bin/sed
而不是sed
,以避免搜索 PATH.)就像我说的,你的脚本对我来说很好用,所以这只是在徒劳地抓虫... - Nemo#!/bin/sh -x
或#!/bin/bash -x
告诉 shell 打印它正在执行的字符... 嘿,我突然有个想法。你是否可能混淆了回车和换行符,以至于 "#" 开头的注释也消耗了你的命令? - Nemocr/lf
,因此我使用VI
将它们全部更改,现在脚本按预期工作 :) - Jamie