Replace Linux/Cygwin:将模式替换为其他模式匹配的结果(sed/find?)

Replace Linux/Cygwin:将模式替换为其他模式匹配的结果(sed/find?),replace,sed,find,cygwin,extract,Replace,Sed,Find,Cygwin,Extract,我有一个像这样的大型文档网站: DOCTITLE 一些标题 我试图用Cygwin在每个文件中用一些标题替换DOCTITLE 更具体地说,我需要从每个文件中提取标记之间的任何文本,并用提取的文本替换文本字符串“DOCTITLE” 这里有一个想法是行不通的,但它说明了我所追求的精神: find . -name "*html" -exec sed -i 's/DOCTITLE/'$(grep "h1" | sed 's/<h1>\(.*\

我有一个像这样的大型文档网站:
DOCTITLE

一些标题

我试图用Cygwin在每个文件中用一些标题替换DOCTITLE

更具体地说,我需要从每个文件中提取
标记之间的任何文本,并用提取的文本替换文本字符串“DOCTITLE”

这里有一个想法是行不通的,但它说明了我所追求的精神:

find . -name "*html"  
       -exec sed -i 
                's/DOCTITLE/'$(grep "h1" | sed 's/<h1>\(.*\)<\/h1>/\1/')'/'
'{}' /;
find-名称“*html”
-行政长官sed-i
's/DOCTITLE/'$(grep“h1”| sed's/\(.*\/\1/')/'
'{}' /;
毫不奇怪,这会失败,因为grep没有输入,它会破坏

有什么想法吗

感谢您的时间和专业知识

这可能适合您(GNU-sed):


find-名称“*html”-exec sed-i'$!Ns/DOCTITLE\([^\n]*\n\([^您使用
$(…)
的方法将不起作用,因为
sed
-exec
参数不处理该语法。但是,我们可以做的是调用
bash
来为我们完成这部分工作:

find . -name '*.html' -exec /bin/bash -c 'sed "s/DOCTITLE/$(sed -n '\''\,<h1>.*</h1>,{s,<h1>\(.*\)</h1>,\1,p;q}'\'' '\''{}'\'')/" "{}"' \;

在这两种情况下,都有一些稍微可怕的引用:
'\'
序列将在一个单引号字符串中插入一个单引号。我们需要引用
sed
语句以确保标题中的任何空格都不会引起问题,我们需要引用文件名以能够处理文件名中的空格。

识别它!非常感谢。很好地找到了第一个
,并通过使用逗号作为分隔符避免了进一步的“斜杠”。
find . -name '*.html' -exec /bin/bash -c 'sed "s/DOCTITLE/$(sed -n '\''\,<h1>.*</h1>,{s,<h1>\(.*\)</h1>,\1,p;q}'\'' '\''{}'\'')/" "{}"' \;
find . -name '*.html' -exec /bin/bash -c 'sed "s/DOCTITLE/$(grep -m1 '\''<h1>.*</h1>'\'' '\''{}'\'' | sed '\''s,<h1>\(.*\)</h1>,\1,'\'')/" "{}"' \;