Попытка поменять элемент JSON с помощью редактора sed на MAC - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь создать скрипт, чтобы найти элемент JSON и обновить его значениями arg.

 #!/bin/bash

# Shell script to verify the end to end D1 request flow
placeLocation=$1 
vehicleHeading=$2
message=$3
file=one.txt

sed -i '' '/location/c\   \"location\" : \"$placeLocation\",' $file
sed -i '' '/heading/c\   \"heading\" : \"$vehicleHeading\",' $file
sed -i '' '/message/c\   \"message\" : \"$message\",' $file

One.txt

"location":"<48.777098,9.181301> - 150.0m",
"message":"Hello there!",
"heading": "34",

Но получаю следующую ошибку

sed: 1: "/location/c\   \"locati ...": extra characters after \ at the end of c command
sed: 1: "/heading/c\   \"heading ...": extra characters after \ at the end of c command
sed: 1: "/message/c\   \"message ...": extra characters after \ at the end of c command
sed: 1: "file.txt": invalid command code f
sed: 1: "file.txt": invalid command code f
sed: 1: "file.txt": invalid command code f
sed: 1: "file.txt": invalid command code f

Я только начал изучать редактор sed и перепробовал несколько вещей, но не смог понять это. Любая помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Чтобы сделать это надежно, вам нужно использовать инструмент, который понимает буквальные строки (чего нет у sed - см. Можно ли надежно избежать метасимволов регулярных выражений с помощью sed ), например, awk:

$ awk 'BEGIN{FS=OFS=":"; val=ARGV[1]; ARGV[1]=""} $1=="\"message\""{sub(FS".*",FS); print $1, "\""val"\""}' 'what is 1/2?' one.txt
"message":"what is 1/2?"

$ awk 'BEGIN{FS=OFS=":"; val=ARGV[1]; ARGV[1]=""} $1=="\"message\""{sub(FS".*",FS); print $1, "\""val"\""}' 'what is 1&2?' one.txt
"message":"what is 1&2?"

$ awk 'BEGIN{FS=OFS=":"; val=ARGV[1]; ARGV[1]=""} $1=="\"message\""{sub(FS".*",FS); print $1, "\""val"\""}' 'what is \1?' one.txt
"message":"what is \1?"

вышеописанное будет работать надежно, используя любой awk в любой оболочке на каждом компьютере UNIX.Попробуйте использовать их в качестве заменяющих строк в команде sed.

Полный скрипт для выполнения того, что вы хотите:

#!/bin/env bash

# Shell script to verify the end to end D1 request flow
placeLocation=$1 
vehicleHeading=$2
message=$3
file=one.txt
tmp=$(mktemp)

awk '
    BEGIN {
        split("location heading message", tags)
        for (i in tags) {
            vals["\"" tags[i] "\""] = "\"" ARGV[i] "\""
            ARGV[i] = ""
        }
        FS=OFS=":"
    }
    $1 in vals {
        tag = $1
        sub(FS".*","")
        $0 = tag OFS vals[tag]
    }
1' "$placeLocation" "$vehicleHeading" "$message" "$file" > "$tmp" && mv "$tmp" "$file"
1 голос
/ 15 июня 2019

Обратите внимание, что вам, вероятно, следует рассмотреть возможность использования инструмента, подобного jq, для редактирования файлов JSON. Но я полагаю, у вас есть веская причина для использования sed, поэтому у вас есть пара проблем.

Во-первых, вы пытаетесь использовать функции GNU sed в вашей версии OS для Mac OS X, которая не имеет этих функций. Если вы хотите использовать GNU sed в Mac OS X, установите его:

▶ brew install gnu-sed

Исправление кода для GNU sed (а также для других рекомендаций руководства по стилю Bash о цитировании строк):

cat > FILE <<EOF
"location":"<48.777098,9.181301> - 150.0m",
"message":"Hello there!",
"heading": "34",
EOF

placeLocation=myPlaceLocation
vehicleHeading=myVehicleHeading
message=myMessage

file=FILE

gsed -i -e '/location/c\' -e '"location": "'"$placeLocation"'",' "$file"
gsed -i -e '/heading/c\' -e '"heading": "'"$vehicleHeading"'",' "$file"
gsed -i -e '/message/c\' -e '"message": "'"$message"'",' "$file"

Как отмечено в руководстве GNU sed , использование нескольких команд -e в одной строке с командой c\ является расширением GNU.

Если вы хотите использовать sed в Mac OS X, просто можете написать это так:

sed -i '' '
  s/"location".*/"location": "'"$placeLocation"'",/
  s/"heading".*/"heading": "'"$vehicleHeading"'",/
  s/"message".*/"message": "'"$message"'",/
' "$file"

Но учтите, что вам придется санировать входные данные, если вам нужен код, устойчивый ко всем входным данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...