使用以下命令,我将文件名添加到每行的开头,并将输出发送到单个文件。
ls | while read file; do sed -e "s/^/$file/g" $file > out; done
我想执行相同的sed
替换,但是使用find
和exec
或xargs
命令-
find . -type f -exec sed "s/^/{}/g" {} > out +
但出现错误-
查找:-exec ...仅支持{}的一个实例... +
输入文件是这样-
fileA.txt
A1
A2
fileB.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 -r 's#(.\/)(.*)# MAGIC
#ge'
这样的sed行中>\1: "./"
和\2 "a.txt"(filename)
e
,所以MAGICcat &\|sed "s:^:file \2 :g
cat&仅输出文件内容,然后通过管道传递到另一个sed。进行替换(s:..:..:g
)键是Gnu sed的'e'。
未经测试,尝试使用xargs
为什么不像这样简单地用ls
替换第一行中的find
?
怎么样:
这个对我来说很好用,并且比肯特的答案更容易使用