使用 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'
您可以使用 awk
s 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
它使用xargs
将find
的结果转移到sh
; bash
剥离扩展名并将参数提供给 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 <
- 使用上面的代码创建一个新的 .sh(例如 modifyFile.sh)文件。
- 授予它执行权限 - chmod +x modifyFile.sh
- 运行 它与包含您的文件名的文件或 w/e - ./modifyFile.sh myInputFile.txt
- 您将在 /tmp/myOutFile.out
中得到结果
我有数百个 .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'
您可以使用 awk
s 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
它使用xargs
将find
的结果转移到sh
; bash
剥离扩展名并将参数提供给 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 <
- 使用上面的代码创建一个新的 .sh(例如 modifyFile.sh)文件。
- 授予它执行权限 - chmod +x modifyFile.sh
- 运行 它与包含您的文件名的文件或 w/e - ./modifyFile.sh myInputFile.txt
- 您将在 /tmp/myOutFile.out 中得到结果