Найти и заменить текст в JSON с помощью sed [duplicate]

Вы можете обойти это, заменив объект (и, следовательно, связать область):

def foo(a=[]):
    a = list(a)
    a.append(5)
    return a

Ужасно, но он работает.

38
задан csta 6 October 2011 в 22:11
поделиться

4 ответа

Переменные внутри ' не заменяются в bash. Чтобы получить подстановку строк (или интерполяцию, если вы знакомы с perl), вам нужно будет изменить ее, чтобы использовать двойные кавычки " вместо одиночных кавычек:

$ # enclose entire expression in double quotes
$ sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

$ # or, concatenate strings with only variables inside double quotes
$ # this would restrict expansion to relevant portion
$ # and prevent accidental expansion for !, backticks, etc
$ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp

$ # variable cannot contain arbitrary characters
$ # see link in further reading section for details
$ a='foo 
bar'
$ echo 'baz' | sed 's/baz/'"$a"'/g'
sed: -e expression #1, char 9: unterminated `s' command

Дальнейшее чтение:

49
ответ дан Sundeep 21 August 2018 в 01:22
поделиться
  • 1
    Возможно, также упоминаем, что если переменная содержит косые черты, вам нужно использовать другой разделитель, который не встречается в строке (или обратная косая черта - избегать каждого появления разделителя). Слэш - это стандартное значение по умолчанию для s, но вы можете использовать любой символ пунктуации; sed "s%draw($prev_number;n_)%draw($number;n_)%g" file.txt или s#from#to#g или s_from_to_g и т. д. – tripleee 25 June 2015 в 07:48
  • 2
    он не работает, если переменная содержит новые строки (& quot;\n & quot;) – dentex 2 April 2018 в 10:06
  • 3
    но он однажды убежал (для моих случаев использования) также слэш: changelogEscaped=$(sed -e 's%\/%\\/%g; $!a\'$'\n''\\n' <<<"$changelog" | tr -d '\n') Спасибо за ссылку выше. – dentex 2 April 2018 в 10:19

Вы можете использовать переменные, как показано ниже. Как здесь, я хотел заменить hostname, т.е. системную переменную в файле. Я ищу строку look.me и заменяю эту целую строку на look.me=<system_name>

sed -i "s/.*look.me.*/look.me=`hostname`/"

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

host_var= `hostname`

sed -i "s/.*look.me.*/look.me=$host_var/"


Входной файл:

look.me=demonic

Вывод файла (при условии, что мое системное имя prod-cfm-frontend-1-usa-central-1):

look.me=prod-cfm-frontend-1-usa-central-1
1
ответ дан daemonsl 21 August 2018 в 01:22
поделиться
sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

будет ли это работать?

5
ответ дан Kent 21 August 2018 в 01:22
поделиться

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

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

Вы также можете заставить его работать с eval, но не делайте этого! !

13
ответ дан Paul Creasey 21 August 2018 в 01:22
поделиться
  • 1
    Спасибо, что сработало. Не могли бы вы объяснить, что вы подразумеваете под расширением? Моя интуиция подсказывает мне, что это должно быть что-то вроде переменной. Также почему бы не использовать eval? – csta 7 October 2011 в 13:52
Другие вопросы по тегам:

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