Найдите шаблон, замените только первые 2 строки и удалите остальные

Чтобы создать документ JSON, содержащий предоставленные пользователем -данные, и правильно закодировать его и т. д., используйте что-то вродеjq:

payload=$( jq --arg content "$data" -n '{"username": "Island", "content": $content}' )

Это создаст небольшой документ JSON в $payload, содержащий значение $dataв поле значения ключа content. Значение будет правильно заключено в кавычки (такие вещи, как двойные кавычки и не -символы ASCII, будут обрабатываться правильно ).

Например, если $dataбуквально

"hello
world"

(включая кавычки и новую строку ), приведенная выше команда создаст следующий документ JSON и назначит его переменной payload:

{
  "username": "Island",
  "content": "\"hello\nworld\""
}

Чтобы удалить ненужные пробелы в сгенерированном документе, используйте jqс опцией -c.

Полный скрипт будет выглядеть так

#!/bin/sh

url='https://discordapp.com/api/webhooks/5738674701/OjRQiAWHq5mX0Tn2MfBlF-mI41TWrVYVAbOfXpeZWqo8'
file='/home/ark/arkserver/ShooterGame/Saved/SaveIsland/1288804998.arktribe'

while inotifywait "$file" ; do
    data=$( strings "$file" | tail -n 5 | head -n 1 | sed 's/<[^>]*>//g' )
    payload=$( jq --arg content "$data" -n '{"username": "Island", "content": $content}' )

    curl -H "Content-Type: application/json" \
         -X POST \
         -d "$payload" \
         "$url"
done

Единственное цитирование, о котором вам нужно беспокоиться, это переменные оболочки, которые должны быть заключены в двойные кавычки как обычно . Нет необходимости пытаться вставлять буквальные кавычки в данные, считанные из вашего конвейера.

-1
13.05.2021, 05:02
1 ответ

С помощью GNU sed с расширенным режимом регулярных выражений -Eмы можем использовать пространство удержания в качестве счетчика.

sed -Ee '
  /^class(\s|$)/!b
  G
  /\n{3}/d
  /\n{2}/s/.*/class Y/
  /\n{1}/s/.*/class X/
  p;z;H;d
' file

Краткое пояснение:

  • компиляция sedиспользованных команд:b G z h H d s/// p
  • О них см. руководство GNU sed
  • Идея состоит в том, чтобы продолжать печатать все те строки, которые не начинаются со слова class
  • Теперь, для линии класса необходимо устранить неоднозначность в трех вещах -когда она видна один раз, два раза или более двух раз.
  • Мы привязываем содержимое пространства удержания к пространству шаблона и внимательно следим за новыми строками.
  • если найдено 3 новых строки => просмотрено более 2 раз. Срочно удалите эту строку. Никакой дальнейшей обработки на нем не происходит.
  • если найдено 2 новых строки => видим во второй раз, измените его.
  • Увидев в первый раз, также внесите еще одно изменение.
  • Для любого из последних двух случаев увеличивается пространство хранения.

С помощью утилиты awk он прост.

awk '
  BEGIN {
    a[1]="class X"
    a[2]="class Y"
  }
  $1 == "class" {
    if ( k++ < 2 ) {
      $0 = a[k]
    } else { next }
  }1
' file

Выход:

school 
class X
class Y
classroom
0
28.07.2021, 11:32

Теги

Похожие вопросы