繁体   English   中英

使用 sed 查找最后一次出现并添加

[英]find last occurrence and prepend using sed

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

#!/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>

这里有一个小技巧:

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

因为sed在第一次出现时起作用,所以要获得最后一次出现,您可以:

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

另外&sed中的替换模式中表示整个匹配的模式。 所以整个</script>在你的情况下。

达:

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') 

echo "$var_insert_js_code"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM