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

Bry*_*yan 7 shell sed find

使用以下内容我将文件名添加到每行的前面,并将输出发送到单个文件.

ls | while read file; do sed -e "s/^/$file/g" $file > out; done
Run Code Online (Sandbox Code Playgroud)

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

find . -type f -exec sed "s/^/{}/g" {} > out +
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误 -

find:-exec ... +仅支持{}的一个实例

输入文件是这样的 -

fileA.txt

A1
A2
Run Code Online (Sandbox Code Playgroud)

fileB.txt

B1
B2
Run Code Online (Sandbox Code Playgroud)

期望的输出

fileA.txt A1
fileA.txt A2
fileB.txt B1
fileB.txt B2
Run Code Online (Sandbox Code Playgroud)

我知道如何用awk做这个,但我想用sed,find和exec或xargs来做.

gle*_*man 5

未经测试,请尝试使用xargs

find . -type f | xargs -I FILE sed "s/^/FILE/g" FILE > out
Run Code Online (Sandbox Code Playgroud)

  • 将“ /”更改为“ |” 为我工作。`找到。型f | xargs -I FILE sed“ s | ^ | FILE | g” FILE> out` (2认同)

Ken*_*ent 5

 find . -type f |xargs awk '$0=FILENAME$0' > out
Run Code Online (Sandbox Code Playgroud)

当我回答这个问题时,你的"没有awk"线还没有.无论如何,请看下面我更新的答案:

根据评论更新

所以你想使用find,exec/xargs和sed来做.我的脚本需要GNU Sed,我希望你拥有它.

首先看一个衬管:(好了,> out省略了.你可以把它添加到生产线的末尾.)

find . -type f | xargs -i echo {}|sed -r 's#(.\/)(.*)#cat &\|sed  "s:^:file \2 :g"#ge'
Run Code Online (Sandbox Code Playgroud)

现在让我们进行测试,见下文:

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
Run Code Online (Sandbox Code Playgroud)

是你期望的结果?

简短说明

  • find ....|xargs -i echo {}无需解释,只需每行打印文件名(带前导"./")
  • 然后将文件名传递给sed行 sed -r 's#(.\/)(.*)# MAGIC #ge'
  • 记得在上面的线,我们有两个组\1: "./"\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'.