我有几个文件,其中我想用文件本身的名称替换某个单词..
例如,我有两个名为test1.txt和test2.txt 的文件两个文件都相同,看起来像
bla1,bla2,temp bla2,bla3,temp
使用sed我想用文件本身的名称替换单词temp
所以在sed操作后我有2个不同的文件
test1.txt,看起来像:
bla1,bla2,test1 bla2,bla3,test1
test2.txt,看起来像:
bla1,bla2,test2 bla2,bla3,test2
所以我的问题......我如何使用输入文件本身的实际名称作为替换命令的一部分?
sed "s/temp/ ??filename??/ ??? " *.txt
感谢您的建议
答案 0 :(得分:3)
我不确定您是否可以使用sed
引用文件名,尽管我可能错了。您可能会使用 shell hack 。使用文件名替换所有出现的temp
的更好方法是以下awk
脚本:
$ awk '{gsub(/temp/,FILENAME)}1' file
答案 1 :(得分:1)
使用awk,awk有FILENAME
变量:
awk '{sub(/temp/,FILENAME)}7' yourfile
答案 2 :(得分:1)
awk 'BEGIN{FS=OFS=","} {$NF=FILENAME}1' file
这个和sub()解决方案之间的区别在于,即使文件中的其他位置存在单词“temp”,这也会起作用,例如:如果“bla1”包含“温度”一词。
如果您需要从发布的所需输出中显示的文件名中删除“.txt”,请将其调整为:
awk 'BEGIN{FS=OFS=","} {t=FILENAME; sub(/\.txt$/,"",t); $NF=t}1' file
您可以编辑FILENAME本身,但我发现如果您不需要,最好不要使用内置变量。
答案 3 :(得分:0)
如果有可用的话,你可以用一点bash来帮助你。
find . -name "test*.txt" -type f | awk -F '/' '{print $2;}' | while read file; do sed -i "s|temp|$file|" ./$file; done
这是一种对脚本的修改,我必须做类似的事情。毫无疑问,它可以缩短。
答案 4 :(得分:0)
没有文件名的sed内部变量,因此您需要一些先前的批处理命令来进行通用过程
for FileName in MyFileShellFilter
do
cat <> ${FileName} | sed "s|,temp$|,${FileName}|"
done
使用文件名只是carrefull,他们通常没有\
但可能&
具有s//
特殊含义。我使用|
作为分隔符来允许文件名中包含/
但是由于这个原因,文件名中不允许使用未转义的|
(通常不允许)
答案 5 :(得分:0)
xargs
:
printf "%s\n" *.txt | xargs -I FILE -L 1 sed 's/temp/FILE/' FILE
文件名不能包含:换行符,斜杠,&符号,单引号。