找到最后一次出现并使用sed

时间:2020-03-08 19:06:37

标签: bash sed

如何查找最后出现的数据并添加数据?我在\1命令的末尾尝试了sed,请参见下面的代码:

#!/bin/bash

var_function_name="func_1"
var_js_code=$(printf '%s' "<script>"$'\n'"</script>"$'\n'"<script>"$'\n'"</script>"$'\n'"<script>"$'\n'"</script>"$'\n')
var_insert_js_code=$(echo "$var_js_code" |sed 's|\(</script>\)|var result = '"$var_function_name"'();\nalert(result)\n\1|') 

echo "$var_insert_js_code"

产生:

<script>
var result = func_1();
alert(result)
</script>
<script>
var result = func_1();
alert(result)
</script>
<script>
var result = func_1();
alert(result)
</script>

我正在尝试仅在最后一个</script>标签之前插入代码。要查看我想要得到的内容,请在下面查看。 请注意,我将不知道会有多少个</script>标签,因此我只是想在找到的最后一个标签上工作。

<script>
</script>
<script>
</script>
<script>
var result = func_1();
alert(result)
</script>

1 个答案:

答案 0 :(得分:2)

这里有个小把戏:

tac | sed -z 's@</script>@&\nsomething@' | tac

由于sed在第一次出现时起作用,因此,您可以:

  • tac-反转线
  • sed -z-将流解析为零分隔 然后
  • tac再次将线颠倒。

&中替换模式中的sed也表示整个匹配的模式。因此,整个</script>就在您的情况下。

Ta da:

var_function_name="func_1"
var_js_code=$(printf '%s' "<script>"$'\n'"</script>"$'\n'"<script>"$'\n'"</script>"$'\n'"<script>"$'\n'"</script>"$'\n')
var_insert_js_code=$(echo "$var_js_code" | tac | sed -z 's|</script>|&\nvar result = '"$var_function_name"'();\nalert(result)|' | tac) 

echo "$var_insert_js_code"

sed中,您可以保留所有行直到模式,并在出现模式时打印最后一行,并在最后一行之前添加数据:

sed -n '
  \@</script>@{
    x
    s/^\n//
    p
    s/.*//
    x
  }
  ${
    H;x
    s/^/var result = '"$var_function_name"'();\nalert(result)/
    p
    q
  }
  H
'

和:

var_function_name="func_1"
var_js_code=$(printf '%s' "<script>"$'\n'"</script>"$'\n'"<script>"$'\n'"</script>"$'\n'"<script>"$'\n'"</script>"$'\n')
var_insert_js_code=$(echo "$var_js_code" | sed -n '\@</script>@{x;s/^\n//;p;s/.*//;x};${H;x;s/^/var result = '"$var_function_name"'();\nalert(result)/;p;q};H;$b') 

回显“ $ var_insert_js_code”

相关问题