Bash не удаляет лидирующие пробелы - PullRequest
1 голос
/ 09 ноября 2011

Кажется, у меня очень странная проблема. Я пытаюсь получить значения полей JSON из команды CURL с помощью jsawk, однако jsawk требует, чтобы его JSON был хорошо напечатан (что может быть легко достигнуто с помощью правильно отформатированного файла JSON благодаря "python -mjson.tool").

Проблема в том, что у меня есть пробел в начале файла / строки JSON (что недопустимо), однако я не могу удалить его.

 {"response": {"status": {"version": "4.2", "code": 5, "message": "The Identifier specified does not exist"}}}

Несколько опций работают независимо от моего скрипта (например, echo ~ / m.json | sed -e 's / ^ [\ t] * //')

{"response": {"status": {"version": "4.2", "code": 5, "message": "The Identifier specified does not exist"}}}

Видишь разницу? Но все следующие методы не достигают желаемого результата. Я даже безуспешно пытался передать строку в sed для эмуляции поведения командной строки. Кто-нибудь может указать мне правильное направление, пожалуйста?

thisjson=$(curl -F "api_key=$apikey" -F "format=json" -F "md5=$thismd5" -F... );
echo $thisjson > $tempjson; #Req'd else bash re-evals curl command
temp=$(cat $tempjson);      #Read string back to variable
echo $temp;                 #Try several methods to strip ws
temp="${temp##+([[:space:]])}";
echo $temp;
temp=$(sed -e 's/^[[:space:]]*//' <<<"$temp")
echo "|${temp}|";
temp=$(echo ${temp/ /} );
temp="${temp#"${temp%%[![:space:]]*}"}"
echo $temp;                #Try piping string directly
thisprettyjson=$(echo $temp | sed -e 's/^[ \t]*//' |python -mjson.tool);
echo $thisprettyjson;

Который выплевывает несколько строк (по одной на каждое эхо) до тех пор, пока "Нет JSON ... декодируется"

 {"response": {"status": {"version": "4.2", "code": 5, "message": "The Identifier specified does not exist"}}}
...
 {"response": {"status": {"version": "4.2", "code": 5, "message": "The Identifier specified does not exist"}}}
No JSON object could be decoded

Я уверен, что есть что-то глупое, что я пропустил. Возможно, единственное, что следует упомянуть, это то, что я изменил IFS с Space / Tab / NL на просто NL.

У кого-нибудь есть идеи? Или альтернативный простой метод анализа JSON? Спасибо!

1 Ответ

1 голос
/ 09 ноября 2011

Я сделал тест, используя это:

tempjson='tempjson.txt'
thisjson=' {"response": {"status": {"version": "4.2", "code": 5, "message": "The Identifier specified does not exist"}}}'
echo $thisjson > $tempjson; #Req'd else bash re-evals curl command
...

Это работает для меня:

{"response": {"status": {"version": "4.2", "code": 5, "message": "The Identifier specified does not exist"}}}
|{"response": {"status": {"version": "4.2", "code": 5, "message": "The Identifier specified does not exist"}}}|

Так что я бы сказал, что у вас есть специальный пробел, который генерируется в началестроки с помощью вашей команды $(curl -F "api_key=$apikey" -F "format=json" -F "md5=$thismd5" -F... );

Поэтому попробуйте удалить первый символ вместо символа пробела, если он не является {{'

...