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

时间:2015-03-05 08:47:49

标签: linux bash sed find

我有数百个.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

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

您可以使用awk的FILENAME。由于gnu awk

,需要4.1&gt; = -i inplace
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>

答案 1 :(得分:1)

要解决代码中的问题,可以尝试以下方法:

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

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

答案 2 :(得分:0)

试试这个

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

答案 3 :(得分:0)

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

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

使用findsh的结果传输到xargs; bash删除扩展名并将参数提供给替换的sed

<强>参数:

find

  • -type f查找文件
  • -name '*.htm',其扩展名为htm
  • printf '%P\0%f\0'输出完整文件路径然后输出ASCII null,然后输入文件名(剥离路径),再输出ASCII nul

xargs

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

sh

  • -c从第一个非选项参数
  • 读取命令
  • 一个bash脚本,它以$1(文件路径)和$2(文件名)作为参数;将正则表达式替换为剪切扩展名。传递一个虚拟字符串replace,以便$0

sed

  • -i就地替换文件
  • -e要执行的脚本

答案 4 :(得分:0)

你也可以试试这个:

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