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

如何在sed replace中使用输入文件的名称,sed,filenames,Sed,Filenames,我有几个文件,其中我想用文件本身的名称替换某个单词 例如,我有两个名为test1.txt和test2.txt的文件 这两个文件是相等的,看起来像 bla1,bla2,temp bla2,bla3,temp 感谢您的建议使用awk,awk有文件名变量: awk '{sub(/temp/,FILENAME)}7' yourfile 使用awk,awk具有文件名变量: awk '{sub(/temp/,FILENAME)}7' yourfile 我不确定您是否可以使用sed引用文件名,尽管我可能错

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

例如,我有两个名为test1.txt和test2.txt的文件

这两个文件是相等的,看起来像

bla1,bla2,temp bla2,bla3,temp
感谢您的建议

使用awk,awk有
文件名
变量:

awk '{sub(/temp/,FILENAME)}7' yourfile

使用awk,awk具有
文件名
变量:

awk '{sub(/temp/,FILENAME)}7' yourfile

我不确定您是否可以使用
sed
引用文件名,尽管我可能错了。您可能会使用shell hack。用文件名替换所有出现的
temp
的更好方法是使用以下
awk
脚本:

$ awk '{gsub(/temp/,FILENAME)}1' file

我不确定您是否可以使用
sed
引用文件名,尽管我可能错了。您可能会使用shell hack。用文件名替换所有出现的
temp
的更好方法是使用以下
awk
脚本:

$ awk '{gsub(/temp/,FILENAME)}1' file

如果可以的话,你可以用一点bash来帮你

find . -name "test*.txt" -type f | awk -F '/' '{print $2;}' | while read file; do sed -i "s|temp|$file|" ./$file; done

这是对剧本的一种拙劣的改编,我必须做一些类似的事情。毫无疑问,它可以缩短。

如果可以的话,你可以用一点bash来帮助你

find . -name "test*.txt" -type f | awk -F '/' '{print $2;}' | while read file; do sed -i "s|temp|$file|" ./$file; done
awk 'BEGIN{FS=OFS=","} {$NF=FILENAME}1' file
这是对剧本的一种拙劣的改编,我必须做一些类似的事情。它无疑可以缩短

awk 'BEGIN{FS=OFS=","} {$NF=FILENAME}1' file
此解决方案与sub()解决方案之间的区别在于,即使文件中的其他地方存在“temp”一词,例如“bla1”包含“temperature”一词,此解决方案也会起作用

如果需要从发布的所需输出中显示的文件名中删除“.txt”,请将其调整为:

awk 'BEGIN{FS=OFS=","} {t=FILENAME; sub(/\.txt$/,"",t); $NF=t}1' file
您可能可以编辑文件名本身,但我发现如果不需要的话,最好不要弄乱内置变量

此解决方案与sub()解决方案之间的区别在于,即使文件中的其他地方存在“temp”一词,例如“bla1”包含“temperature”一词,此解决方案也会起作用

如果需要从发布的所需输出中显示的文件名中删除“.txt”,请将其调整为:

awk 'BEGIN{FS=OFS=","} {t=FILENAME; sub(/\.txt$/,"",t); $NF=t}1' file

您可能可以编辑文件名本身,但我发现如果不需要的话,最好不要弄乱内置变量。

文件名没有sed内部变量,因此您需要一些以前的批处理命令来执行一般流程

for FileName in MyFileShellFilter
 do
    cat <> ${FileName} | sed "s|,temp$|,${FileName}|"
 done
MyFileShellFilter中文件名的

做
cat${FileName}| sed“s |,temp$|,${FileName}|”
完成

只要使用文件名,它们通常没有
\
,但可能有
&
的特殊含义。我使用
|
作为分隔符,允许在文件名中使用
/
,但由于这个原因,在文件名中不允许使用未转义的
|
(通常不允许)

没有用于文件名的sed内部变量,因此您需要一些以前的批处理命令

for FileName in MyFileShellFilter
 do
    cat <> ${FileName} | sed "s|,temp$|,${FileName}|"
 done
MyFileShellFilter中文件名的

做
cat${FileName}| sed“s |,temp$|,${FileName}|”
完成

只要使用文件名,它们通常没有
\
,但可能有
&
的特殊含义。我使用
|
作为分隔符,允许在文件名中使用
/
,但由于这个原因,在文件名中不允许使用未转义的
|
(通常不允许)

xargs

printf "%s\n" *.txt | xargs -I FILE -L 1 sed 's/temp/FILE/' FILE

文件名不能有:换行符、斜杠、符号和单引号。

带有
xargs

printf "%s\n" *.txt | xargs -I FILE -L 1 sed 's/temp/FILE/' FILE

文件名不能有:换行符、斜杠、符号和单引号。

该死!我发布了长得可笑的答案,却没有意识到awk中有一个变量。不错。@user3099593在stackoverflow上显示你对答案印象深刻的方式是(当你得到足够的代表时)向上投票。您现在应该通过单击答案旁边的勾号来接受对您最有用的答案。一些addtl问题。。。1) 我想去掉文件名的文件类型2)我想在文件名周围加“;”;文件名;3) 我想将输出写回当前正在读取和更改的同一个文件。。因此,在我的用例中,我有一个文件过滤器*.txt,它可以处理几十个文件。。只需将输出定向到带有>outfile的文件,就可以在一个输出文件中获得所有文件的所有数据。。那么,如何实际重用当前文件作为输出文件的名称。。还是那个打开了,我需要一个临时文件。。。大家好!该死我发布了长得可笑的答案,却没有意识到awk中有一个变量。不错。@user3099593在stackoverflow上显示你对答案印象深刻的方式是(当你得到足够的代表时)向上投票。您现在应该通过单击答案旁边的勾号来接受对您最有用的答案。一些addtl问题。。。1) 我想去掉文件名的文件类型2)我想在文件名周围加“;”;文件名;3) 我想将输出写回当前正在读取和更改的同一个文件。。因此,在我的用例中,我有一个文件过滤器*.txt,它可以处理几十个文件。。只需将输出定向到带有>outfile的文件,就可以在一个输出文件中获得所有文件的所有数据。。那么,如何实际重用当前文件作为输出文件的名称。。还是那个打开了,我需要一个临时文件。。。大家好!我不确定这个例子是否具有代表性,如果是,这将是一个更好的解决方案。如果不是,那么我们就是在黑暗中拍摄:-)我们不是一直。。只是有时候,OP的触感比其他人更亮,并且朝向正确的方向。我不确定这个例子是否具有代表性,如果是,这将是一个更好的解决方案。如果不是,那么我们就是在黑暗中拍摄:-)我们不是一直。。只是有时候OP的触感比其他人更亮,而且朝向正确的方向。不。不,不,不。最后-不:-)不仅上面的程序冗长且效率低下,它还有几个潜在的错误,会让你在