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,'\'')/" "{}"' \;