найти последнее вхождение и подготовить с помощью sed - PullRequest
0 голосов
/ 08 марта 2020

Как я могу найти последнее вхождение и предварительно добавить данные? Я пробовал \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 Ответ

2 голосов
/ 08 марта 2020

Вот небольшой трюк:

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"

...