Чтобы создать документ 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
Единственное цитирование, о котором вам нужно беспокоиться, это переменные оболочки, которые должны быть заключены в двойные кавычки как обычно . Нет необходимости пытаться вставлять буквальные кавычки в данные, считанные из вашего конвейера.
С помощью 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
С помощью утилиты 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