动态引用文件名

动态引用文件名

在单个目录中,我想用文件名替换每个文件的第一行。每个文件的第一行都是“TestRelation”。我想用文件名替换它。

我知道我可以用来perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt浏览所有文件。但是如何动态更改文件名中的“REPLACE_WITH”呢?

答案1

尝试:

perl -i.bak -wpe 's/SEARCH_FOR/$ARGV/g' *.txt

$ARGV读取时包含当前文件的名称<>

因为你使用-iswitch,所以你不用担心安全影响perl当使用-n或switch运行时-p

答案2

带有“here document”的 shell 脚本可以很好地处理这个问题:

#!/bin/bash
for NAME in t?
do
ex -s $NAME << END_EDITS
1s/TestRelation/$NAME/
w!
q
END_EDITS
done

不知道你的文件的名称是什么,我选择“t1”、“t2”、“t3”等作为文件名。您必须根据需要生成文件名。

“for”循环NAME每次通过循环都会为 shell 变量提供文件名的值。bash执行上述脚本的实例调用每个ex文件名的编辑器,并为其提供一些输入行。 ex命令1s/TestRelation/$NAME/由实例扩展bash,用文件名替换“$NAME”部分。

您必须END_EDITS在行首有结束“此处文档”(在本例中)的标记,前面没有空格。

答案3

你可以尝试这样的事情。

for i in `ls *.sh`; do echo "$i">>$i.new; cat $i.new $i >>$i.new;done

它的作用主要是列出文件并存储文件名。将这些名称写入新文件并将其与原始文件一起使用。如果需要,您还可以将 .new 文件移至原始文件名。这不是最优雅的选择,但它确实有效。

答案4

如果您只想在 shell 中执行此操作,请使用find命令列出文件,然后basename使用命令获取文件名并使用sed替换字符串

for i  in $(find . -type f); do fname=$(basename $i); sed -i "s/TestRelation/${fname}/" $fname; done

好吧basename,这不是必需的,如果您确定只有您正在搜索的特定目录中的文件,find则可以使用ls

相关内容