使用 find 和 sed 将文件名插入文件

Insert file names into files using find and sed

我有数百个 .htm 文件,我需要用实际文件名替换 <title>sometext</title>。 例如: 我有一个名为 records-england.htm 的文件,我需要用这样的文件名替换此文件中的 <title>sometext</title> <title>records-england.htm</title>

如果没有扩展名就更好了——但这并不重要。 我试过这样但没有用:

find . -name *.htm | while read file; do sed "s|<title>sometext</title>|<title>$file</title>|g" {} \; done

有什么建议吗?

像这样尝试

's/\<title\>.*\<title\>/title>$file<title/g'

您可以使用 awks FILENAME。由于 -i inplace

,需要 gnu awk >= 4.1
awk -i inplace '{a=FILENAME;sub(/\.htm$/,"",a);gsub(/<title>[^<]*<\/title>/,"<title>"a"</title>")}1' *.htm

这会将 <title>sometext</title>(其中 sometext 可以是任何值)更改为 <title>filename(without extension)</title>

这适用于任意标题文本。如果您不希望它是任何文本而是一些固定文本,则将 <title>.*</title> 更改为 <title>sometext</title>.

 find -type f -name '*.htm' -printf '%P[=10=]%f[=10=]' | xargs -0 -n2 sh -c 'fil="${2/\.htm/}"; sed -i -e "s;<title>.*</title>;<title>$fil</title>;" ' replace

它使用xargsfind的结果转移到shbash 剥离扩展名并将参数提供给 sed 进行替换。

参数:

find

  • -type f 查找文件
  • -name '*.htm' 扩展名为 htm
  • printf '%P[=22=]%f[=22=]' 输出完整的文件路径,然后是一个 ASCII 空值,然后是文件名(剥离路径),然后是一个 ASCII 空值

xargs

  • -0 使用 ASCII nul 作为分隔符
  • -n2 每次执行命令时最多从列表中选取 2 个参数

sh

  • -c 从第一个 non-option 参数读取命令
  • 一个bash脚本,它以</code>(文件路径)和<code>(文件名)作为参数;执行正则表达式替换以删除扩展名。传递一个虚拟字符串 replace 让它接受 [=31=]

sed

  • -i in-place 在文件中替换
  • -e 要执行的脚本

要解决代码中的问题,您可以尝试这样做:

find -name "*.htm" | while read file; do sed "s|<title>sometext</title>|<title>${file##*/}</title>|g" -i $file; done

Sed 需要 -i 选项来指定要编辑的文件,我使用参数扩展仅显示文件的基本名称。

你也可以试试这个:

#!/bin/bash
outFile=/tmp/myOutFile.out
touch $outFile
while read line
do
    name=$line
    echo "<title>$name</title>" >> $outFile
done < 
  1. 使用上面的代码创建一个新的 .sh(例如 modifyFile.sh)文件。
  2. 授予它执行权限 - chmod +x modifyFile.sh
  3. 运行 它与包含您的文件名的文件或 w/e - ./modifyFile.sh myInputFile.txt
  4. 您将在 /tmp/myOutFile.out
  5. 中得到结果