【发布时间】:2014-06-07 16:43:24
【问题描述】:
我在 OSX 上有一个文件夹,其中包含从在线 DVR 下载的电视节目。我想制作一个程序列表并将其格式化以匹配另一个列表以进行比较。
当我在 shell 中运行以下命令时,一切正常,我得到了我想要的列表。
ls *.mp4 > loaded_shows.txt
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt
cat loaded_shows.txt
当我将相同的命令放入 bash 脚本时,即使脚本与文件位于同一目录中,sed 也会为每个就地替换提供以下错误消息。
sed: rename(): 没有这样的文件或目录
为了完整起见,这里是 bash 脚本:
#!/bin/bash
ls *.mp4 > loaded_shows.txt
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt # replace last _ with space
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt # again replace last _ with space
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt # remove the file extension
cat loaded_shows.txt
以及示例输入文件名:
666_Park_Avenue_2014-04-22_23.35.mp4
Americans_2014-04-20_22.45.mp4
Scandal_2014-04-20_21.00.mp4
The_Voice_of_USA_2014-04-22_19.30.mp4
如何让 sed 在 bash 脚本中工作?
【问题讨论】:
-
你是如何运行 Bash 脚本的?它仍然创建loaded_shows.txt吗?
-
我发现我做错了什么。问题在于 -i 参数的格式。我在某处看到了这个例子,没有进一步解释。我尝试了几种告诉 sed 不要备份文件的方法,而 -i$0 是我发现的唯一一个似乎适用于 OSX 的示例。在发布此问题后阅读更多内容后,我意识到 -i$0 在脚本中不起作用。我用 -i '' (之间的空格)替换了它,现在脚本可以工作并创建loaded_shows.txt。一些示例建议使用 -i''(之间没有空格),这在 OSX 上不起作用。
-
你打败了我。我建议
-i .bak作为论据。$0可能有用;它是脚本的名称,但如果它在$0中有路径信息,你就完蛋了。 -
我遇到了同样的问题。我不需要备份文件 - 是的,我知道我在做什么 ;-)。 -i 之后的空格和两个双引号完成了这项工作:
sed -e 's,2016-11-03.01,2016-11-03.02,g' -i ""find src web -type f``
标签: macos bash shell sed scripting