3

所以我最近将 Django 从 1.4 升级到了 1.5。我发现我需要更新所有模板代码以添加单引号,例如 from

{% url user_detail pk=user.pk %}

{% 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在找到的每个文件中的 url 名称周围添加单引号ack

如果我尝试

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

编辑

我正在运行 OS X(BSD 变体),所以我需要使用sed -i "" "s/{% url \([A-Za-z0-9_]*\) /{% url '\1' /g".

4

1 回答 1

3
ack -l "{% url" | xargs sed -i "s/{% url \([A-Za-z0-9_]*\) /{% url '\1' /g"

-l列出来自ack(您的cut/的更简单版本uniq)的匹配文件。 xargs对从管道(即每个文件)获取的每个参数执行操作。你试图做的将是sed来自标准输入的文件列表的实际字符串,当然不能就地更新。

于 2013-04-11T05:14:43.927 回答