使用以下内容,我将文件名添加到每行的前面,并将输出发送到单个文件。
ls | while read file; do sed -e "s/^/$file/g" $file > out; done
我想执行同样的操作sed
替换但使用find
and exec
or xargs
命令 -
find . -type f -exec sed "s/^/{}/g" {} > out +
但我收到一个错误 -
find: -exec 仅支持一个 {} 实例 ... +
输入文件是这样的 -
文件A.txt
A1
A2
文件B.txt
B1
B2
期望的输出
fileA.txt A1
fileA.txt A2
fileB.txt B1
fileB.txt B2
我知道如何使用 awk 执行此操作,但我想使用 sed、find 和 exec 或 xargs 执行此操作。
find . -type f |xargs awk '$0=FILENAME$0' > out
当我回答这个问题时,你的“no awk”行还没有出现。无论如何,看看下面我更新的答案:
根据评论更新
所以你想使用 find、exec/xargs 和 sed 来完成此操作。我的脚本需要GNU Sed,我希望你拥有它。
首先看一行:(好吧,> out
被省略。您可以将其添加到该行的末尾。 )
find . -type f | xargs -i echo {}|sed -r 's#(.\/)(.*)#cat &\|sed "s:^:file \2 :g"#ge'
现在我们来测试一下,如下:
kent$ head *.txt
==> a.txt <==
A1
A2
==> b.txt <==
B1
B2
kent$ find . -type f | xargs -i echo {}|sed -r 's#(.\/)(.*)#cat &\|sed "s:^:file \2 :g"#ge'
file b.txt B1
file b.txt B2
file a.txt A1
file a.txt A2
结果是你所期望的吗?
简短说明
-
find ....|xargs -i echo {}
没什么可解释的,只需打印
每行文件名(带前导"./"
)
- 然后将文件名传递给 sed 行,例如
sed -r 's#(.\/)(.*)# MAGIC
#ge'
- 请记住,在上面的行中,我们有两组
\1: "./"
and
\2 "a.txt"(filename)
- 因为我们有
e
在 sed 行的末尾,MAGIC部分是
作为 shell 命令执行。(需要 GNU sed)
-
MAGIC:
cat &\|sed "s:^:file \2 :g
cat & 只是输出文件
内容,并通过管道传输到另一个 sed。进行替换(s:..:..:g
)
- 最后,MAGIC的执行结果将是替换
外部 sed。
关键是 Gnu sed 的“e”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)