如何查找最后出现的数据并添加数据?我在\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>
答案 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”