Bash 对stdin中的文件列表执行sed-i

Bash 对stdin中的文件列表执行sed-i,bash,sed,django-urls,ack,django-1.5,Bash,Sed,Django Urls,Ack,Django 1.5,因此,我最近将Django从1.4升级到1.5。我发现我需要更新所有的模板代码来添加单引号,比如 {% url user_detail pk=user.pk %} 到 我对bash命令有点陌生,比如sed,但我从两个部分讨论了我的问题 第一部分是获取所有需要更新的文件的列表。那是我用的 ack "{% url" | cut -d ":" -f1 | uniq 这会给我一个类似的输出 templates/some_file.html templates/admin/another_file.h

因此,我最近将Django从1.4升级到1.5。我发现我需要更新所有的模板代码来添加单引号,比如

{% url user_detail pk=user.pk %}

我对bash命令有点陌生,比如
sed
,但我从两个部分讨论了我的问题

第一部分是获取所有需要更新的文件的列表。那是我用的

ack "{% url" | cut -d ":" -f1 | uniq
这会给我一个类似的输出

templates/some_file.html
templates/admin/another_file.html
第二部分是与sed玩游戏

cat templates/some_file.html | sed "s/{% url \([A-Za-z0-9_]*\) /{% url '\1' /g"
这两个命令都可以正常工作。现在的问题是

如何组合这两个命令,以便
sed
ack
找到的每个文件中的url名称周围添加单引号?

如果我尝试

ack "{% url" | cut -d ":" -f1 | uniq | sed -i "s/{% url \([A-Za-z0-9_]*\) /{% url '\1' /g"
这给了我一个错误

sed: -i may not be used with stdin
编辑

我正在运行OSX(BSD变体),所以我需要使用
sed-I”“”s/{%url\([A-Za-z0-9\]*\)/{%url'\1'/g“


-l
列出了来自
ack
的匹配文件(更简单的
cut
/
uniq
)。
xargs
对从管道获取的每个参数(即每个文件)执行操作。您试图对stdin中的文件列表的实际字符串执行
sed
,当然无法对其进行更新。

我运行了该命令,当我再次执行
ack
时,我注意到所有文件都没有更改。我确实收到了一个错误:
sed:1:“doors/templatetags/brea…”:在d命令的末尾增加了一些字符,但我认为这只是我的
sed
表达式没有捕捉到所有的情况。@hobbes3奇怪的是,所有的文件都没有改变——我做了一个非常小的测试。先尝试
sed
而不使用
-I
看看你是否得到了我运行的任何输出
ack-l“{%url”| xargs sed”s/{%url\([A-Za-z0-9\.]*\/{%url'\1'/g“{%url'
(我忘了在正则表达式中找到
),它用添加的单引号显示输出。是不是因为在d命令的末尾有一个错误
sed:1:…额外的字符正在中止整个
sed
文件重写?这个问题()帮助。我将命令更改为
sed-I”“”s/{%url…
,它成功了!我没有提到我的系统是OSX,它是BSD的变体。谢谢。
sed: -i may not be used with stdin
ack -l "{% url" | xargs sed -i "s/{% url \([A-Za-z0-9_]*\) /{% url '\1' /g"