使用find和sed将文件名添加到文件开头

问题描述 投票:7回答:5

使用以下命令,我将文件名添加到每行的开头,并将输出发送到单个文件。

ls | while read file; do sed -e "s/^/$file/g" $file > out; done

我想执行相同的sed替换,但是使用findexecxargs命令-

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来做到这一点。

shell sed find
5个回答
5
投票
 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)
  • 因为我们在sed行的末尾有e,所以MAGIC
  • 部分应为作为shell命令执行。(需要GNU sed)
  • MAGIC
  • cat &\|sed "s:^:file \2 :g cat&仅输出文件内容,然后通过管道传递到另一个sed。进行替换(s:..:..:g
  • 最后,MAGIC的执行结果将是外层sed。
  • 键是Gnu sed的'e'。


5
投票

未经测试,尝试使用xargs


1
投票

为什么不像这样简单地用ls替换第一行中的find


0
投票

怎么样:


0
投票

这个对我来说很好用,并且比肯特的答案更容易使用

© www.soinside.com 2019 - 2024. All rights reserved.