使用 sed 时如何重定向 xargs 的输出

How to redirect out put of xargs when using sed

自从切换到更好的管理系统后,我想删除每个源文件顶部的所有冗余日志。在 Notepad++ 中,我能够通过使用 "replace in files" 并将 \A(//.*\n)+ 的匹配项替换为空白来实现结果。然而,在 Linux 上我没有这样的运气,我需要求助于 'xargs' 和 'sed'。

我使用的 sed 表达式是:

sed '1,/^[^\/]/{/^[^\/]/b; d}'

确实丑陋,但它确实有效。

我遇到的问题是,当我尝试 运行 通过 'xargs' 以向其提供我们系统中的所有源文件时,我无法将输出重定向到 'stripped' 文件,然后我打算将其复制到原件上。

我想要符合以下条件的东西:

find . -name "*.com" -type f -print0 | xargs -0 -I file sed '1,/^[^\/]/{/^[^\/]/b; d}' "file" > "file.stripped"

但是,由于我已经使用了太多引号,所以我很难将“>”传递给接收环境 (shell)。我已经尝试了各种逃避方式和 shell "wrappers" 但我就是无法让它打球。

有人愿意为我指出正确的方向吗?

谢谢, 斯拉蒂

我用一个更简单的 sed 表达式做了一个类似的场景作为例子,看看它是否适合你:

我创建了 3 个文件,每个文件中都包含字符串 "abcd":

# ls -l
total 12
-rw-r--r-- 1 root root 5 Oct  6 09:05 test.aaaaa.com
-rw-r--r-- 1 root root 5 Oct  6 09:05 test2.aaaaa.com
-rw-r--r-- 1 root root 5 Oct  6 09:05 test3.aaaaa.com
# cat test*
abcd
abcd
abcd

运行 您使用 -exec 选项而不是 xargs 显示的 find 命令,并将 sed 表达式替换为一个愚蠢的表达式,只需将每个 "a" 替换为 "b" 和选项 -i,直接写入输入文件:

# find . -name "*.com" -type f -print0 -exec sed -i 's/a/b/g' {} \;
./test2.aaaaa.com./test3.aaaaa.com./test.aaaaa.com
# cat test*
bbcd
bbcd
bbcd

在你的情况下它应该是这样的:

# find . -name "*.com" -type f -print0 -exec sed -i '1,/^[^\/]/{/^[^\/]/b; d}' {} \;