使用sed

时间:2016-10-06 09:24:02

标签: linux redirect sed xargs

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

我使用的sed表达式是:

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

丑陋可以肯定,但似乎确实有用。

我遇到的问题是当我试图通过' xargs'为了提供我们系统中的所有源文件,我无法将输出重定向到“剥离”#39;文件,然后我打算复制原件。

我想要的是:

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

然而,我已经悲伤地通过">"直到接收环境(shell),因为我已经使用了太多的引号。我已经尝试过各种各样的逃避和外壳包装"但是我无法让它打球。

有人想指出我正确的方向吗?

谢谢, Slarti。

1 个答案:

答案 0 :(得分:0)

我用一个更简单的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表达式替换为简单替换“b”的每个“a”和替换-i的选项-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}' {} \;