Выход blackslash в sed

Я столкнулся с этой проблемой также, хотя не так часто как каждый день.
Кому-то еще, у кого была подобная проблема, сказали отключить IPv6, и он, по-видимому, работал: http://ubuntuforums.org/showthread.php?t=1528202
Я пытаюсь сделать это также использующее более обновленные инструкции от: http://www.noobslab.com/2012/05/disable-ipv6-if-your-internet-is.html
Сообщите мне, работает ли это на Вас или если Вы нашли другое решение.

ОБНОВЛЕНИЕ: оказалось, что дефектный маршрутизатор вызывал проблему. Изменение маршрутизатора решило его для меня.

4
17.01.2014, 01:42
2 ответа

Если я читаю то право, Вы пытаетесь заменить наклонные черты вправо (/) с завершенной наклонной чертой вправо (\/)? Это становится намного легче обработать, если Вы не используете / как Ваш разделитель в sed:

~ $ pwd | sed 's_/_\\/_g'`
\/home\/username
~ $ echo "$( pwd | sed 's_/_\\/_g' )"
\/home\/username
7
27.01.2020, 20:49
  • 1
    2-я команда зафиксировал его. Когда я использовал '' вместо $ (), удар удалял обратные косые черты –  Franz Payer 16.01.2014, 20:55
  • 2
    , Это - одна из многих причин это `` подоболочки были удержаны от использования в пользу $() subshells-они являются намного лучше ведущими себя с вложением во многих отношениях. Приобретение знаний об использовании другого sed разделители также удалили много non-human-parseable 'частоколов' в некоторых моих сценариях. Довольный помочь! –  DopeGhoti 16.01.2014, 20:57

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

  1. оболочкой в замене команды,
  2. оболочкой вне замены команды,
  3. sed.

Во-первых, не используйте форму обратной галочки замены команды: его правила для кавычек внутри intrincate. Используйте долларовые круглые скобки, который имеет интуитивные правила — что, внутри обычно анализируется, с соответствием близкая круглая скобка, отмечающая конец подоболочки.

Затем Вы используете двойные кавычки для команды sed. Избегайте этого: Ваша команда sed не может быть записана буквально, необходимо защитить \ и $ и для оболочки и для sed. Используйте одинарные кавычки вместо этого.

Также у Вас есть наклонные черты в Вашем тексте замены. Sed не может знать, что эти наклонные черты не являются частью его синтаксиса, но буквенного текста, который Вы хотите включать. Можно использовать символ кроме / разграничить s, g или m команда. Используйте символ, который никогда не появляется в Вашем тексте замены (к счастью, здесь, это легко, потому что Вы знаете текст замены).

Я предполагаю это echo pwd должен действительно быть pwd (или echo "$PWD"). Без потребности защитить наклонные черты, Вам не нужен вложенный вызов sed. Если действительно необходимо было преобразовать pwd, рассмотреть использование $PWD и средства обработки строк shelll вместо этого.

sed -i 's~^log.*$!log '"$PWD"'/redis/redis.log!' ./conf/redis.conf

Если Вам приходится нелегко с заключением в кавычки, используйте более легкий инструмент, такой как Perl. Perl сочетает функции sed и оболочки, таким образом, Вы не сталкиваетесь с заключением в кавычки проблем между двумя.

perl -MCwd -i -pe 'BEGIN {$PWD = cwd} s[^log.*][log $PWD/redis/redis.log]' conf/redis.conf

или

perl -MCwd -i -pe '$_ = cwd."/redis/redis.log" if /^log' conf/redis.conf
2
27.01.2020, 20:49

Теги

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