我有数百个.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
有什么建议吗?
答案 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
使用find
将sh
的结果传输到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
从第一个非选项参数$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