Aviso de isenção de responsabilidade : isso pressupõe que nenhuma tag </form>
seja colocada na mesma linha de uma tag <cfoutput>
ou </cfoutput>
, como parece ser o caso do exemplo. se esse não for o caso, isso pode se comportar mal e substituir as tags </form>
que precedem uma tag <cfoutput>
na mesma linha e tags </form>
seguindo uma tag </cfoutput>
anterior na mesma linha com a string errada. Portanto, se o seu caso de uso for mais complicado do que parece no exemplo (ou seja, você tem </form>
tags na mesma linha de <cfoutput>
ou </cfoutput>
tags), é melhor procurar um analisador de HTML. Caso contrário, isso funcionará bem.
Usando awk
:
awk '/<cfoutput>/,/<\/cfoutput>/ {sub(/<\/form>/, "<input type=\"hidden\" name=\"_token\" value=\"#STOKEN#\"/>", $0); print; next} {sub(/<\/form>/, "<input type=\"hidden\" name=\"_token\" value=\"<cfoutput>#STOKEN#</cfoutput>\"/>", $0); print}' infile
awk
script expandido:
/<cfoutput>/,/<\/cfoutput>/ {
sub(/<\/form>/, "<input type=\"hidden\" name=\"_token\" value=\"#STOKEN#\"/>", $0);
print;
next
}
{
sub(/<\/form>/, "<input type=\"hidden\" name=\"_token\" value=\"<cfoutput>#STOKEN#</cfoutput>\"/>", $0);
print
}
-
/<cfoutput>/,/<\/cfoutput>/
: executa a seguinte instrução (composta) somente se o registro atual estiver entre um registro contendo uma string<cfoutput>
e um registro contendo uma string</cfoutput>
; -
sub(/<\/form>/, "<input type=\"hidden\" name=\"_token\" value=\"#STOKEN#\"/>", $0);
: substitui todas as ocorrências de</form>
no registro atual por<input type="hidden" name="_token" value="#STOKEN#"/>
; -
print
: imprime o registro atual -
next
: pula para o próximo registro -
sub(/<\/form>/, "<input type=\"hidden\" name=\"_token\" value=\"<cfoutput>#STOKEN#</cfoutput>\"/>", $0);
: substitui todas as ocorrências de</form>
no registro atual por<input type="hidden" name="_token" value="<cfoutput>#STOKEN#</cfoutput>"/>
; -
print
: imprime o registro atual
user@debian ~ % cat infile
<html>
<!-- stuff -->
</form>
<cfoutput>
</form>
</cfoutput>
<!-- stuff -->
</html>
user@debian ~ % awk '/<cfoutput>/,/<\/cfoutput>/ {sub(/<\/form>/, "<input type=\"hidden\" name=\"_token\" value=\"#STOKEN#\"/>", $0); print; next} {sub(/<\/form>/, "<input type=\"hidden\" name=\"_token\" value=\"<cfoutput>#STOKEN#</cfoutput>\"/>", $0); print}' infile
<html>
<!-- stuff -->
<input type="hidden" name="_token" value="<cfoutput>#STOKEN#</cfoutput>"/>
<cfoutput>
<input type="hidden" name="_token" value="#STOKEN#"/>
</cfoutput>
<!-- stuff -->
</html>