如何在sed replace中使用输入文件的名称

时间:2013-12-13 13:49:55

标签: sed filenames

我有几个文件,其中我想用文件本身的名称替换某个单词..

例如,我有两个名为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

感谢您的建议

6 个答案:

答案 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

文件名不能包含:换行符,斜杠,&符号,单引号。