Можно ли избежать двойных кавычек и получить правильный формат json?

Вы можете получить все установленные пакеты в системе с помощью pacman -Qq, и вы можете получить все пакеты в базе данных синхронизации с помощью pacman -Slq. Затем вам нужно выполнить сравнение списков

comm -23 <(pacman -Qq | sort) <(pacman -Slq | sort)

. Вы также можете использовать pacman -Qm, который возвращает только пакеты, не находящиеся в базе данных синхронизации.

0
16.12.2016, 13:05
2 ответа

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

2
28.01.2020, 02:16

В

var="foo\
bar"

Последовательность \ является специальной внутри двойных кавычек, но не внутри одинарных кавычек и является удалено , поэтому $ var содержит foobar .

Когда вы делаете:

echo $json

Вы используете оператор split + glob (неявный оператор вызывается, когда вы забываете процитировать расширение), то есть содержимое $ json разделяется для символов в $ IFS , и каждое слово подлежит генерации имени файла (также называемой подстановкой).

Значение по умолчанию $ IFS содержит пробел табуляции и новой строки (а пробел, табуляция и новая строка также подвергаются особой обработке в отношении разделения, поскольку любая их последовательность считается как единица и ведущая и завершающие игнорируются). Так, например, в:

var='  foo  *
bar'

echo $var

$ var сначала разбивается на foo , * и bar ( разделенная часть ) и * расширяется до списка нескрытых файлов в текущем каталоге (часть glob ).

Если вы хотите отображать контент как есть (но обратите внимание, что многие реализации echo могут искажать контент), вы должны написать:

$ echo "$json"
[     {         "count": 3     } ]

Теперь, если вы намерены сжать интервалы , возможно, вы можете использовать оператор split + glob в своих интересах.

json='
  [
    {
      "count": 3
    }
  ]'

unset -v IFS # make sure we get a default splitting behaviour.
             # an unset -v IFS is equivalent to IFS=$' \t\n'
set -o noglob # disable the glob part

echo $json # use the split+glob operator

echo выводит свои аргументы, разделенные пробелами, поэтому каждая последовательность символа пробела, табуляции или новой строки будет фактически заменена одним символом пробела (кроме начального и конечного, которые будут удалены, и echo добавляет в конец один символ новой строки). Таким образом, вы получите:

[ { "count": 3 } ]

В любом случае, это не будет различать, находятся ли пробелы в кавычках или нет, поэтому это может изменить значение данных json ( "foo bar" будет преобразован в "foo bar" , например).

Если вы хотите использовать последовательность \ для экранирования (удаления) символов новой строки, но в противном случае оставьте другие пустые символы без необходимости экранировать символы двойных кавычек, вы можете использовать здесь -document:

json=$(cat <<EOF
  [\
    {\
      "count": 3\
    }\
  ]
EOF
)
echo "$json"

Что даст:

  [    {      "count": 3    }  ]

(новые строки были удалены (вы могли сохранить некоторые из них, не добавляя к ним обратную косую черту), но другие пустые символы остались нетронутыми).

3
28.01.2020, 02:16

Теги

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