搜索和替换多个文件(包括子目录)

搜索和替换多个文件(包括子目录)

我想要搜索所有出现的:

</form>

在当前目录及其子目录中将每个出现的内容替换为:

<input type="hidden" name="_token" value="<cfoutput>#STOKEN#</cfoutput>"/>
</form>

我在一个文件上尝试了以下操作。文件被touch编辑——上次修改日期已更改——但未进行替换:

sed -i -re 's/\<\/form\>/\<input type="hidden" name="_token" value="\<cfoutput\>#STOKEN#\<\/cfoutput\>"\>\<\/form\>/gi' ./math.cfm

我错过了什么? 有没有更好的命令可用于此?

答案1

\<和元素\>在 sed 正则表达式中具有特殊含义(作为单词边界)。

不要使用/sed 的分隔符并尝试正确转义而使事情变得困难 - 选择文本中未出现的替代分隔符,例如%|

i插入) 命令对我来说似乎是比此任务的命令更自然的选择s:你可以尝试

'\%</form>% i\<input type="hidden" name="_token" value="<cfoutput>#STOKEN#</cfoutput>"/>'

要将此类命令递归地应用于子目录,您可以将 sed 命令作为-exec-execdir参数提供到find例如

find path/to/dir -type f -name '*.cfm' -execdir sed -i -re '\%</form>% i\<input type="hidden" name="_token" value="<cfoutput>#STOKEN#</cfoutput>"/>' {} +

或者,您可以使用 shell 的globstar功能。

相关内容