Как избежать двойных и одинарных кавычек в sed?

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

Например,

sed -i 's/"https://www.fubar.com"/URL_FUBAR/g'

Я хочу заменить «https://www.fubar.com» на URL_FUBAR. Как sed должен распознавать мои // или мои двойные кавычки?

Спасибо за любую помощь!

EDIT: Могу ли я использовать s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g?

Действительно ли \ экранирует символы внутри одинарных кавычек?

См. также:  Что не так с управляющими символами в инструменте командной строки PHPUnit?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 10
  1. KRB

    Команда s/// в sed позволяет использовать другие символы вместо / в качестве разделителя, как в

    sed 's#"https://www\.fubar\.com"#URL_FUBAR#g'
    

    or

    sed 's,"https://www\.fubar\.com",URL_FUBAR,g'
    

    Двойные кавычки не проблема. Для сопоставления одинарных кавычек поменяйте местами два типа кавычек. Обратите внимание, что строка в одинарных кавычках не может содержать одинарные кавычки (даже экранированные).

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

    отличный ответ dood, у меня просто есть быстрый вопрос. Как бы я сделал одинарные кавычки вместо своих двойных. В моем коде есть экземпляры, где он либо одинарный, либо двойной. Я могу просто запустить эту команду дважды, но каков синтаксис для экранирования одинарной кавычки? person KRB; 22.09.2011

    Экранирование одинарных кавычек у меня не сработало (bash на Mac), но сработало использование других типов кавычек для упаковки команды, чем заменяемая кавычка. например: sed 's/"/bla/g' для замены " на bla или sed "s/'/bla/g" to replace ‘` на bla person KRB; 01.05.2018

    @rrr Строка в одинарных кавычках не может содержать встроенную одинарную кавычку. Изменение внешних кавычек (и экранирование любых специальных символов, интерпретация которых теперь может быть интересна оболочке) — один из способов решить эту проблему. Другой способ — вырваться из строки в одинарных кавычках и соединить строку с "'" (одинарная кавычка в двойных кавычках), прежде чем продолжить с остальной частью строки в одинарных кавычках, как в 'you'"'"'d better do that'. person KRB; 21.03.2019

  2. KRB

    Трудно избежать одинарной кавычки в одинарных кавычках. Попробуй это:

    sed "[email protected]['\"]https://www.\([^.]\+).com['\"]@URL_\U\[email protected]" 
    

    Пример:

    $ sed "[email protected]['\"]https://www.\([^.]\+\).com['\"]@URL_\U\[email protected]" <<END
    this is "https://www.fubar.com" and 'https://www.example.com' here
    END
    

    производит

    this is URL_FUBAR and URL_EXAMPLE here
    
  3. KRB

    Вам нужно использовать \» для экранирования » символа (\ экранировать следующий символ

    sed -i 's/\"https://www.fubar.com\"/URL_FUBAR/g'
    
  4. KRB

    Может быть символ «\», попробуйте этот:

    sed 's/\"https:\/\/www.fubar.com\"/URL_FUBAR/g'
    

    предложение дикой догадки не является решением. вместо этого вы можете добавить такие догадки в комментарии — или даже лучше — сначала попробуйте person KRB; 14.01.2017

  5. KRB
  6. KRB

    Моя проблема заключалась в том, что мне нужно было иметь "" вне выражения, так как у меня есть динамическая переменная внутри самого выражения sed. Итак, фактическое решение заключается в том, что от Ленна Джекмана вы заменяете " внутри регулярного выражения sed на [\"].

    Итак, мой полный удар:

    RELEASE_VERSION="0.6.6"
    
    sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml
    

    Вот:

    # — разделитель sed

    [\"] = " в регулярном выражении

    value = \"tags/$RELEASE_VERSION\" = моя строка замены, важно, что она имеет только \" для кавычек

  7. KRB

    Что касается одинарной кавычки, см. приведенный ниже код, используемый для замены строки let's на let us:

    команда:

    echo "hello, let's go"|sed 's/let'"'"'s/let us/g'
    

    результат:

    привет, пойдем

    Есть намного способ сделать это проще. Попробуйте: echo "hello, let's go" | sed s/let\'s/let us/g. На самом деле вам не обязательно указывать параметр для sed в одинарных кавычках. person KRB; 27.05.2021

  8. KRB

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

    Вот пример, который затрагивает экранирование в sed, но также фиксирует некоторые другие проблемы с цитированием в bash:

    # cat inventory
    PURCHASED="2014-09-01"
    SITE="Atlanta"
    LOCATION="Room 154"
    

    Предположим, вы хотите изменить комнату с помощью сценария sed, который вы можете использовать снова и снова, поэтому вы изменяете ввод следующим образом:

    # i="Room 101" (these quotes are there so the variable can contains spaces)
    

    Этот сценарий добавит всю строку, если ее там нет, или просто заменит (используя sed) строку, которая там есть, текстом плюс значение $i.

    if grep -q LOCATION inventory; then 
    ## The sed expression is double quoted to allow for variable expansion; 
    ## the literal quotes are both escaped with \ 
        sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory
    ## Note the three layers of quotes to get echo to expand the variable
    ## AND insert the literal quotes
    else 
        echo LOCATION='"'$i'"' >> inventory
    fi
    

    P.S. Я написал приведенный выше сценарий в несколько строк, чтобы сделать комментарии разборчивыми, но я использую его как однострочный в командной строке, который выглядит следующим образом:

    i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi
    
  9. KRB

    Кроме того: выражения sed, содержащие переменные BASH, должны быть заключены в двойные (") кавычки, чтобы переменная интерпретировалась правильно.

    Если вы также заключаете свою переменную $BASH в двойные кавычки (рекомендуемая практика)

    … тогда вы можете избежать двойных кавычек переменной, как показано:

    sed -i "s/foo/bar ""$VARIABLE""/g" <file>
    

    То есть замените ", связанный с $VARIABLE, на "".

    (Простое экранирование "$VAR" вместо \"$VAR\" приводит к выходной строке с " в кавычках.)


    Примеры

    $ VAR='apples and bananas'
    $ echo $VAR
    apples and bananas
    
    $ echo "$VAR"
    apples and bananas
    
    $ printf 'I like %s!\n' $VAR
    I like apples!
    I like and!
    I like bananas!
    
    $ printf 'I like %s!\n' "$VAR"
    I like apples and bananas!
    

    Здесь $VAR заключен в " перед передачей в sed (sed заключен либо в ', либо в "):

    $ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
    I like apples and bananas!
    
    $ printf 'I like %s!\n' "$VAR" | sed 's/"$VAR"/cherries/g'
    I like apples and bananas!
    
    $ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
    I like apples and bananas!
    
    $ printf 'I like %s!\n' "$VAR" | sed 's/""$VAR""/cherries/g'
    I like apples and bananas!
    
    $ printf 'I like %s!\n' "$VAR" | sed "s/$VAR/cherries/g"
    I like cherries!
    
    $ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
    I like cherries!
    

    Сравните это с:

    $ printf 'I like %s!\n' $VAR | sed "s/$VAR/cherries/g"
    I like apples!
    I like and!
    I like bananas!
    
    
    $ printf 'I like %s!\n' $VAR | sed "s/""$VAR""/cherries/g"
    I like apples!
    I like and!
    I like bananas!
    

    … и так далее …

    Заключение

    Моя рекомендация, как стандартная практика, состоит в том, чтобы

    • "-переменные BASH в кавычках ("$VAR")
    • "-кавычки, снова, эти переменные (""$VAR""), если они используются в выражении sed (которое само должно быть заключено в ", а не ' в кавычки)
    $ VAR='apples and bananas'
    
    $ echo "$VAR"
    apples and bananas
    
    $ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
    I like cherries!
    
    
  10. KRB

    Ты можешь использовать %

    sed -i "s%https://www.fubar.com%URL_FUBAR%g"
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: