使用 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}' {} \;
自从切换到更好的管理系统后,我想删除每个源文件顶部的所有冗余日志。在 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}' {} \;