sed无法正常使用多个输入文件

时间:2014-07-04 00:52:23

标签: sed zsh

sed -i正在创建子目录中所有文件的备份,然后进行编辑(如预期的那样),但它实际上并不是在子目录中编辑文件。

$ mkdir -p a/b
$ echo "A" > a/a.txt
$ echo "B" > a/b/b.txt

现在我有两个文本文件,一个位于a

子目录中的a个文件中
$ sed -i.bac "1s/^/PREPENDED /" a/**/*.txt

为两者创建备份:

$ find a  
a
a/a.txt
a/a.txt.bac
a/b
a/b/b.txt
a/b/b.txt.bac

仅编辑a.txt:

$ cat a/a.txt   
PREPENDED A

$ cat a/b/b.txt 
B

我正在使用ZSH(所以我有globstar支持),而且我在Mac上。

为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:4)

它正在发生,因为你的sed调用只有一行,恰好在a.txt。如果你想让它为每个文件做,那么你需要多次调用sed。

for f in a/**/*.txt
do
  sed ... "$f"
done

答案 1 :(得分:1)

由于您需要通过多个级别的目录进行下载,因此单独调用sed是不够的。但是,使用find,您可以在一行中完成您想要的任务。如果您不熟悉find ... -exec '{}' \;,则需要花费几分钟startpage.com进行快速搜索。在您的情况下,以下调用运行良好:

find a -type f -name "*.txt" -exec sed -i.bac 's/^/PREPENDED /' '{}' \;

此处find在目录a及以下所有内容中搜索与-type f匹配的任何文件(*.txt),然后搜索每个文件(由'{}'表示){ {1}}执行-exec,最后提供转义sed -i.bac 's/^/PREPENDED /'以指示\;命令的结束。

结果:

-exec

正如已正确指出的那样,使用globstar set $ ls -1 a b a.txt a.txt.bac $ ls -1 a/b b.txt b.txt.bac $ cat a/a.txt PREPENDED A $ cat a/b/b.txt PREPENDED B 时,不必使用shopt -s globstar,因为find的以下调用就足够了:

sed