我有大量包含文本的文件。所有文件都包含“替换”一词(无引号)。我想用文件名替换该单词。
例如,文件名是: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
请注意,此处的文件名不得包含逗号(您可以选择该字符,使其不会出现在文件名中)。