【问题标题】:Performing a sed -i on a list of files in stdin对标准输入中的文件列表执行 sed -i
【发布时间】:2013-04-03 04:48:22
【问题描述】:

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

{% url user_detail pk=user.pk %}

到

{% url 'user_detail' pk=user.pk %}

我对 sed 这样的 bash 命令有点陌生,但我分两部分处理了我的问题。

第一部分是获取所有需要更新的文件的列表。我这样做了

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

编辑

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

【问题讨论】:

    标签: bash sed django-urls ack django-1.5


    【解决方案1】:
    ack -l "{% url" | xargs sed -i "s/{% url \([A-Za-z0-9_]*\) /{% url '\1' /g"
    

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

    【讨论】:

    • 我运行了那个命令,当我再次执行ack 时,我注意到所有文件都没有改变。好吧,我确实遇到了一个错误:sed: 1: "doors/templatetags/brea ...": extra characters at the end of d command,但我认为这只是我的sed 表达式没有涵盖所有情况。
    • @hobbes3 奇怪的是文件都没有改变——我做了一个非常简单的测试。先试试sed 不带-i 看看有没有输出
    • 好的,我跑了ack -l "{% url" | xargs sed "s/{% url \([A-Za-z0-9_.]*\) /{% url '\1' /g" | grep '{% url'(我忘了在正则表达式中找到.),它显示了添加了单引号的输出。
    • 是不是因为sed: 1: ... extra characters at the end of the d command 的一个错误正在中止整个sed 文件的重写?
    • 这个问题 (stackoverflow.com/questions/7648328/getting-sed-error) 有帮助。我将命令更改为sed -i "" "s/{% url ...,它成功了!我没有提到我的系统是 OS X,它是一个 BSD 变体。谢谢。
    猜你喜欢
    • 2012-01-03
    • 2016-06-25
    • 1970-01-01
    • 2014-02-22
    • 2014-02-10
    • 1970-01-01
    • 2012-11-05
    • 2011-11-29
    • 2017-09-20
    相关资源
    最近更新 更多