【问题标题】:Prepend to multiple files in bash/osx terminal在 bash/osx 终端中添加多个文件
【发布时间】:2010-10-05 23:09:52
【问题描述】:

我想在 bash 中为多个文件添加一些文本,我发现这篇文章处理了 prepend:prepend to a file one liner shell?

我可以使用 find 找到我需要处理的所有文件:

find ./ -name "somename.txt"

但是如何使用管道将两者结合起来呢?

【问题讨论】:

    标签: shell


    【解决方案1】:

    您有多种选择。最简单的可能是 sed:

    find ./ -name somename.txt -exec sed -e '1i\
    My new text here' {} \;
    

    如果您在准备文本后添加“2q”来告诉它您已完成,并且如果将在带有 -i 标志的文件中发生,它会更快:

    find ./ -name somename.txt -exec sed -i .bak -e '2q;1i\
    My new text here' {} \;
    

    要添加多行,您需要以反斜杠结束每一行。

    这会留下带有.bak 扩展名的原始文件。

    【讨论】:

    • 这个似乎是为我做的,其他很好的例子多次插入文本(我认为每个新行一个)我只需要添加 -type 文件并将 -e 更改为 - i 让 sed 更新文件。
    • 是的。使用 'iText' 匹配每一行,因此在每一行之前插入文本。 '1i' 仅匹配第一行。 '0a' 也会这样做。 '2q' 并不是真正需要的,但可以让 sed 不必查看每一行并说“不,这也不是第 1 行”。
    • 试过这个:find . -iname .java -exec sed -e '1i\ / * 版权所有 (c) 2012 Company X, Inc. 保留所有权利。 /'{}\;结果如下: sed: 3: "1i\\n/*\n Copyright (c) ...": invalid command code *
    • 想通了 - 对于我想插入的多行文本,如果后面还有另一行,我必须将 \ 放在行尾。在之前的评论中应该有换行符,因为我插入的文本有多行。看起来他们被删除了,抱歉。
    • P.S.一个问题仍然存在——文件没有更新,我只是在标准输出中得到了输出。在 Mac OS X 10.6 上试过这个。
    【解决方案2】:
    find . -name "somefiles-*-.txt" -type f | while read line; do  sed -i 'iThis text gets prepended' -- "$line"; done
    

    find . -name "somefiles-*-.txt" -type f | xargs sed -i 'iGets prepended' --
    

    最好的(我认为):

    find . -name "somefiles-*-.txt" -type f -exec sed -i 'iText that gets prepended (dont remove the i)' -- '{}' \;
    

    感谢缺少的“-提示。然后我也添加了重要的--s。

    【讨论】:

    • 通常最好引用 $line ("$line")。不幸的是,现在带有空格的文件名很常见......
    • 这可能是 GNU 主义;原始 sed 想要 'i\ 后跟换行符,然后是要附加的文本。
    • 对于#2,您希望将 -print0 与 find 一起使用,将 -0 与 xargs 一起使用,以避免文件夹名称中带有空格的问题。对于 #3,您应该使用 \+ 而不是 \;避免为每个文件分叉一个进程。
    • 对于#3:我已经尝试过,它在原始文件中的 each 行之前添加了新文本。我在 i 标志之后添加了“1”(如下所示:-i 'i1Text...')并且它工作正常(在开始时只添加一次)
    【解决方案3】:
    find ./ -name "somename.txt" -print0 | xargs -0 -n 1 prepend_stuff_to
    

    【讨论】:

      【解决方案4】:
      find . -name "somename.txt" | while read a; do prepend_stuff_to "$a" ; done
      

      find . -name "somename.txt -exec prepend_stuff_to "{}" \;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-25
        • 1970-01-01
        • 2017-09-11
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多