使用以下内容我将文件名添加到每行的前面,并将输出发送到单个文件.
ls | while read file; do sed -e "s/^/$file/g" $file > out; done
Run Code Online (Sandbox Code Playgroud)
我想执行相同的sed替换,但使用find和exec或xargs 命令 -
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来做.
未经测试,请尝试使用xargs
find . -type f | xargs -I FILE sed "s/^/FILE/g" FILE > out
Run Code Online (Sandbox Code Playgroud)
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 -r 's#(.\/)(.*)# MAGIC
#ge'\1: "./"和
\2 "a.txt"(filename)e在sed行结束时,MAGIC部分将作为shell命令执行.(需要GNU sed)cat &\|sed "s:^:file \2 :g cat&只是输出文件内容,并管道到另一个sed.做替换(s:..:..:g)关键是Gnu sed的'e'.