查找并替换为文件名

查找并替换为文件名

我有大量包含文本的文件。所有文件都包含“替换”一词(无引号)。我想用文件名替换该单词。

例如,文件名是:On Time.txt

将“替换”(无引号)一词替换为“按时”(无引号)。

答案1

我会使用 sed 来实现:

for f in *.txt
do
    fullfile="$f"

    # filename without path (on_time.txt)
    filename=$(basename "$fullfile")

    # remove extension of filename (on_time)
    filename_woext="${filename%.*}"

    # replace all occurrences of "replace" with "on_time" in file
    sed -i -e "s/replace/$filename_woext/g" $filename

done

答案2

在 ZSH 中这很简单:

$ for f in *.txt; do filename=`echo ${f:r}`; sed -i -e "s/replace/$filename/" $f; done

答案3

find . -name "*" -type f | xargs sed -i -e "s/replace/On\ Time/g"

这将根据您的需要替换当前目录(和子目录)下的“所有”文本文件。

如果您只想在当前目录中而不是在其子目录中。

find . -name "*" -type f -maxdepth 1 | xargs sed -i -e "s/replace/On\ Time/g"

如果您想替换到与当前目录不同的目录中。

find /path/do/dir -name "*" -type f | xargs sed -i -e "s/replace/On\ Time/g"

在 zsh shell 上为我工作。也应该致力于其他所有事情。

答案4

for filename in "On time.txt" ; do
  replacement=$(echo $filename | sed -e 's,^.*/,,' -e 's,\.[^\.]*$,,')
  [ -f "$filename" ] && sed -i "s,replace,$replacement," "$filename"
done

要执行目录中的所有文件,请将“On time.txt”替换为 *,如下所示:

for filename in * ; do

请注意,此处的文件名不得包含逗号(您可以选择该字符,使其不会出现在文件名中)。

相关内容