String 如何通过命令行替换文件夹中所有出现的字符串(如果该字符串后跟另一个字符串)

String 如何通过命令行替换文件夹中所有出现的字符串(如果该字符串后跟另一个字符串),string,bash,replace,sed,command-line,String,Bash,Replace,Sed,Command Line,我有一个包含大量HTML的目录,在HTML中有不同的锚定标记,这些锚定标记具有相同的href <a href="foo">First</a> <a href="foo">Second</a> <a href="foo">Third</a> <a href="foo">Second</a> 也可接受没有find/sed的解决方案 编辑-我的解决方案 在实现了下面@karakfa的部分答案后,我意识到我

我有一个包含大量HTML的目录,在HTML中有不同的锚定标记,这些锚定标记具有相同的href

<a href="foo">First</a>
<a href="foo">Second</a>
<a href="foo">Third</a>
<a href="foo">Second</a>
也可接受没有find/sed的解决方案

编辑-我的解决方案


在实现了下面@karakfa的部分答案后,我意识到我还需要搜索(并排除)正则表达式的第二部分。因为在我的实际用例中,锚标记中可能还有其他属性。在那之后,我使用perl而不是sed提出了这一点,因为sed不适用于我使用的非include

find . -type f -exec perl -pi -e 's%foo(?=.*Second)%bar%g' {} \;
find . -type f -exec perl -pi -e 's%foo(?=.*Second)%bar%g' {} \;

您可能不想替换所有
foo
s。可以使用更受限的查找/替换

  ... sed -r 's~(<a href=")foo(">Second</a>)~\1bar\2~' 
。。。sed-r的s~()~\1bar\2~'

在实现@karakfa的部分答案后,我意识到我还需要搜索(并排除)正则表达式的第二部分。因为在我的实际用例中,锚标记中可能还有其他属性。在那之后,我使用perl而不是sed提出了这一点,因为sed不适用于我使用的非include

find . -type f -exec perl -pi -e 's%foo(?=.*Second)%bar%g' {} \;
find . -type f -exec perl -pi -e 's%foo(?=.*Second)%bar%g' {} \;

搜索所有文件,在foo上用bar查找并替换,其中第二个在行的某个地方。

用HTML解析器实际解析文件会更安全,然后用
/a[@href=“foo”][text()=“second”]
替换
bar
@choroba我以前从未尝试过这样做,但是快速的谷歌搜索显示一些python库可能会起到作用。你会特别使用什么?你真的会建议html使用
sed
?如果你有文本处理工具作为你的锤子,所有的问题看起来都像钉子一样你是说
。。。将看起来像纯文本
。但这里的情况并非如此,改进后的搜索完成了我所寻找的,尽管我跳转到perl的find/replace以排除要替换的字符串后面的内容。谢谢你为我指明了正确的方向@karakfa