Linux sed экранирование кавычек

Содержание
  1. Глава 5. Кавычки
  2. Какие символы мне нужно экранировать при использовании sed в скрипте sh?
  3. unixforum.org
  4. sed. экранировать одинарную кавычку в переменной
  5. sed. экранировать одинарную кавычку в переменной
  6. Re: sed. экранировать одинарную кавычку в переменной
  7. Re: sed. экранировать одинарную кавычку в переменной
  8. Re: sed. экранировать одинарную кавычку в переменной
  9. Re: sed. экранировать одинарную кавычку в переменной
  10. Re: sed. экранировать одинарную кавычку в переменной
  11. Re: sed. экранировать одинарную кавычку в переменной
  12. Re: sed. экранировать одинарную кавычку в переменной
  13. Linux sed экранирование кавычек
  14. Основные команды Sed
  15. Замена слова в файле
  16. Замена слова в файле и вывод результата в другой файл
  17. Замена слова в нескольких файлах одновременно
  18. Отбросить всё, что левее определённого слова
  19. Отбросить всё, что правее определённого слова
  20. Экранирование символов в sed
  21. Два условия одновременно в Sed

Глава 5. Кавычки

Кавычки, ограничивающие строки с обеих сторон, служат для предотвращения интерпретации специальных символов, которые могут находиться в строке. (Символ называется «специальным», если он несет дополнительную смысловую нагрузку, например символ шаблона — * .)

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

Примечательно, что «не окавыченный» вариант команды grep [Пп]ервая *.txt будет правильно исполняться в Bash, но не в tcsh.

Вообще, желательно использовать двойные кавычки ( » » ) при обращении к переменным. Это предотвратит интерпретацию специальных символов, которые могут содержаться в именах переменных, за исключением $ , ` (обратная кавычка) и \ (escape — обратный слэш). [1] То, что символ $ попал в разряд исключений, позволяет выполнять обращение к переменным внутри строк, ограниченных двойными кавычками ( «$variable»), т.е. выполнять подстановку значений переменных (см. Пример 4-1, выше).

Двойные кавычки могут быть использованы для предотвращения разбиения строки на слова. [2] Заключение строки в кавычки приводит к тому, что она передается как один аргумент, даже если она содержит пробельные символы — разделители.

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

Пример 5-1. Вывод «причудливых» переменных

Одиночные кавычки ( ‘ ‘ ) схожи по своему действию с двойными кавычками, только не допускают обращение к переменным, поскольку специальный символ «$» внутри одинарных кавычек воспринимается как обычный символ. Внутри одиночных кавычек, любой специальный символ, за исключением ‘ , интерпретируется как простой символ. Одиночные кавычки ( «строгие, или полные кавычки» ) следует рассматривать как более строгий вариант чем двойные кавычки ( «нестрогие, или неполные кавычки» ).

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

Экранирование — это способ заключения в кавычки одиночного символа. Экранирующий ( escape ) символ ( \ ) сообщает интерпретатору, что следующий за ним символ должен восприниматься как обычный символ.

С отдельными командами и утилитами, такими как echo и sed, экранирующий символ может применяться для получения обратного эффекта — когда обычные символы при экранировании приобретают специальное значение.

Специальное назначение некоторых экранированных символов

используемых совместно с echo и sed \n

Источник

Какие символы мне нужно экранировать при использовании sed в скрипте sh?

Возьмите следующий скрипт:

Если я попытаюсь запустить это в sh ( dash здесь), это потерпит неудачу из-за круглых скобок, которые должны быть экранированы. Но мне не нужно избегать обратной косой черты (между октетами или в \s или \1 ). Какое правило здесь? Как насчет того, когда мне нужно использовать <. >или [. ] ? Есть ли список того, что я делаю и не нужно убегать?

Здесь есть два уровня интерпретации: shell и sed.

В оболочке все между одинарными кавычками интерпретируется буквально, за исключением самих одинарных кавычек. Вы можете эффективно заключить одинарную кавычку в одинарные кавычки ‘\» (закрыть одинарную кавычку, одну буквальную одинарную кавычку, открыть одинарную кавычку).

Sed использует основные регулярные выражения . В BRE, чтобы их можно было трактовать буквально, символы $.*[\^ должны быть заключены в кавычки, перед ними стоит обратная косая черта, за исключением внутренних наборов символов ( […] ). Буквы, цифры и ()<>+?| не должны быть заключены в кавычки (вы можете избежать цитирования некоторых из них в некоторых реализациях). Последовательности \( , \) , \n , и в некоторых реализациях \ < , \>, \+ , \? , \| и другой обратный слэш + буквенно — цифровые имеют особое значение. Вы можете избежать неприятностей $^ в некоторых позициях в некоторых реализациях.

Кроме того, вам нужен обратный слеш перед тем / , как он появится в регулярном выражении вне выражений в скобках. Вы можете выбрать альтернативный символ в качестве разделителя, написав, например, s

p ; перед разделителем вам понадобится обратный слеш, если вы хотите включить его в BRE. Если вы выбираете символ, имеющий особое значение в BRE, и хотите включить его буквально, вам понадобится три обратных слеша; Я не рекомендую это, поскольку это может вести себя по-другому в некоторых реализациях.

В двух словах, для sed ‘s/…/…/’ :

  • Напишите регулярное выражение между одинарными кавычками.
  • Используйте, ‘\» чтобы закончить с одинарной кавычкой в ​​регулярном выражении.
  • Поставьте обратную косую черту перед $.*/[\]^ и только этими символами (но не внутри скобочных выражений). (Технически вы не должны ставить обратную косую черту раньше, ] но я не знаю реализации, которая обрабатывает ] и \] отличается от скобочных выражений.)
  • Внутри выражения в скобках, — чтобы его можно было трактовать буквально, убедитесь, что оно первое или последнее ( [abc-] или [-abc] нет [a-bc] ).
  • Внутри выражения в скобках, ^ чтобы его можно было трактовать буквально, убедитесь, что оно не первое (используйте [abc^] , а не [^abc] ).
  • Чтобы включить ] в список символов, совпадающих с выражением в скобках, сделайте его первым символом (или первым после ^ для отрицательного набора): []abc] или [^]abc] (не [abc]] ни [abc\]] ).

В тексте замены:

  • & и \ должны быть заключены в кавычки, перед ними стоит обратная косая черта, как и разделитель (обычно / ) и символы новой строки.
  • \ сопровождаемая цифра имеет особое значение. \ сопровождаемая буквой имеет специальное значение (специальные символы) в некоторых реализациях, и \ после нее следуют некоторые другие символьные средства \c или в c зависимости от реализации.
  • С одинарными кавычками вокруг аргумента ( sed ‘s/…/…/’ ), используйте, ‘\» чтобы поместить одинарную кавычку в текст замены.

Если регулярное выражение или текст замены происходит из переменной оболочки, помните, что

  • Регулярное выражение — это BRE, а не буквальная строка.
  • В регулярном выражении символ новой строки должен быть выражен как \n (который никогда не будет совпадать, если у вас нет другого sed кода, добавляющего символы новой строки в пространство шаблона). Но обратите внимание, что он не будет работать внутри скобочных выражений с некоторыми sed реализациями.
  • В тексте замены & , \ и новые строки должны быть в кавычках.
  • Разделитель должен быть заключен в кавычки (но не внутри скобочных выражений).
  • Используйте двойные кавычки для интерполяции: sed -e «s/$BRE/$REPL/» .

Источник

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

sed. экранировать одинарную кавычку в переменной

Модератор: /dev/random

sed. экранировать одинарную кавычку в переменной

Сообщение nerve » 24.06.2014 10:48

почему в последнем случае первая команда седа работает, а вторая — нет?

Re: sed. экранировать одинарную кавычку в переменной

Сообщение Bizdelnick » 24.06.2014 11:15

в консол и
вку́пе (с чем-либо)
в общем
в ообще
в течени е (часа)
нович ок
нюанс
п о умолчанию
приемл емо
пробле ма
проб овать
тра фик

Re: sed. экранировать одинарную кавычку в переменной

Сообщение SLEDopit » 24.06.2014 11:20

Оно работает в обоих случаях. Просто echo съедает экраны.

Если вам важно хранить \ в переменной, используйте

upd. что-то я долго печатал.

Re: sed. экранировать одинарную кавычку в переменной

Сообщение nerve » 24.06.2014 11:30

Re: sed. экранировать одинарную кавычку в переменной

Сообщение Bizdelnick » 24.06.2014 11:30

в консол и
вку́пе (с чем-либо)
в общем
в ообще
в течени е (часа)
нович ок
нюанс
п о умолчанию
приемл емо
пробле ма
проб овать
тра фик

Re: sed. экранировать одинарную кавычку в переменной

Сообщение nerve » 24.06.2014 11:45

Re: sed. экранировать одинарную кавычку в переменной

Сообщение Bizdelnick » 24.06.2014 11:52

в консол и
вку́пе (с чем-либо)
в общем
в ообще
в течени е (часа)
нович ок
нюанс
п о умолчанию
приемл емо
пробле ма
проб овать
тра фик

Re: sed. экранировать одинарную кавычку в переменной

Сообщение kpocobok » 19.01.2015 15:47

Текст не заменяется. Мне сказали про экранирование, но я не могу понять как тут заэкранировать одинарные ковычки и квадратные скобки.
Хелп плиз =)

Источник

Linux sed экранирование кавычек

Это статья про SED.

Про AWK вы можете прочитать в статье AWK

Про GREP в статье GREP

По умолчанию я предполагаю, что Вы работаете в Bash под Windows 10 или в Bash в Linux .

Основные команды Sed

Для того чтобы применить SED достаточно ввести в командную строку

echo ice | sed s/ice/fire/

Обратите внимание на то, что использовать / не обязательно.

Вы можете после s поставить какой-то другой символ, например : или , или |

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

echo mice | sed s/m/r/
echo mice | sed s , m , r ,
echo mice | sed s : m : r :

Если вы выбрали |, то команду нужно взять в кавычки — у | есть особая роль в bash — pipeline

echo mice | sed ‘s|m|r|’

Если вы редактируете пути до файлов (а они содержат /) то это как раз тот случай, когда удобно выбрать другой разделитель

Например, нужно заменить /bin/bash на /bin/sh

Намного удобнее использовать @ как разделитель чем экранировать каждый слеш.

Сравните две идентичные команды

sed ‘s @ /bin/bash @ /bin/sh @ ‘ /etc/passwd

sed ‘s / \ /bin \ /bash / \ /bin \ /sh / ‘ /etc/passwd

Замена слова в файле

Обычно SED применяют к файлам, например к логам или конфигам.

Предположим, что у нас есть файл input.txt следующего содержания

Here is a String Here is an Integer Here is a Float

Мы хотим заменить слово Here на There

sed ‘s/Here/There/’ input.txt

Результат будет выведен в консоль:

There is a String

There is an Integer

There is a Float

Если нужно не вывести в консоль (в stdout) а изменить содержание файла — используем опцию -i

sed -i ‘s/Here/There/’ input.txt

В этом случае перепишется исходный файл input.txt

Хорошей практикой считается сначала проверить свой скрипт без -i и если всё работает верно внести изменения в файл.

С помощью -i.bak можно создать резервный файл (бэкап)

Рассмотрим пример посложнее.

Пусть файл input.txt теперь выглядит так:

Here is an Apple. Here is a Pen. Here is an ApplePen Integer is Here Here is a Float Here is a Pen. Here is a Pineapple. Here is a PineapplePen

sed ‘s/Here/There/’ input.txt

Как Вы сейчас увидите, замена произойдёт только по одному разу в строке

There is an Apple. Here is a Pen. Here is an ApplePen

Integer is There

There is a Float

There is a Pen. Here is a Pineapple. Here is a PineapplePen

Чтобы заменить все слова нужна опция g

sed ‘s/Here/There/g’ input.txt

There is an Apple. There is a Pen. There is an ApplePen
Integer is There

There is a Float

There is a Pen. There is a Pineapple. There is a PineapplePen

Замена слова в файле и вывод результата в другой файл

Та же замена, но с выводом в новый текстовый файл, который мы назовём output:

sed ‘s/Here/There/’ input.txt > output.txt

Замена слова в нескольких файлах одновременно

Если нужно обработать сразу несколько файлов: например файл 1.txt с содержанием

First File: Here

И файл 2.txt с содержанием

Second File: Here

Это можно сделать используя *.txt

sed ‘s/Here/There/’ *.txt > output.txt

На выходе файл output.txt будет выглядеть так

First File: There Second File: There

Отбросить всё, что левее определённого слова

Предположим, что у нас есть файл input.txt следующего содержания

Here is a String it has a Name Here is an Integer it has a Name Here is a Float it has a Name

Мы хотим отбросить всё, что находится левее слова it, включая слово it, и записать в файл.

sed ‘s/^.*it//’ input.txt > output.txt

^ означает, что мы стартуем с начала строки Результат:

Для доступности объясню синтаксис сравнив две команды. Посмотрите внимательно, когда мы заменяем слово Here на There.

There находится между двумя слэшами. Раскрашу их для наглядности в зелёный и красный.

sed ‘s/Here /There /

А когда мы хотим удалить что-то, мы сначала описываем, что мы хотим удалить. Например, всё от начала строки до слова it.

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

sed ‘s/^.*it / /‘ > output.txt

Отбросить всё, что правее определённого слова

Предположим, что у нас есть файл input.txt следующего содержания

Here is a String / it has a Name Here is an Integer / it has a Name Here is a Float / it has a Name

Мы хотим отбросить всё, что находится правее слова is, включая слово is, и записать в файл.

sed ‘s/is.*//’ > output.txt

Экранирование символов в sed

Специальные символы экранируются с помощью &#92 ;

Что включать в специальные символы зависит от того, какой sed вы используете, но $.*[\^ а также пробелы и кавычки советую экранировать всегда.

Пробел также можно заменять на \s

. в регулярных выражениях обозначает один любой символ кроме начала новой строки \n поэтому, если вы хотите написать url используйте &#92

Пример экранирования точек и кавычек для смены локали в CentOS можете изучить здесь

Предположим, что есть файл input.txt следующего содержания

Here is a String / it has a Name Here is an Integer / it has a Name Here is a Float it / has a Name

Мы хотим отбросить всё, что находится левее /a, включая /a, и записать в файл.

sed ‘s/^.*/a//’ > output.txt

В результате получим ошибку

-e expression #1, char 15: unknown option to `s’

Чтобы команда заработала нужно добавить \ перед /

Here is a String Here is an Integer Here is a Float

Экранирование пробелов может пригодиться при замене одной фразы на другую

Чтобы в скрипте sites.sh из директории /opt/andrei/scripts/ заменить фразу Bike website topbicycle.ru на Travel website heihei.ru нужно выполнить

sed -i s/Bike \ website \ topbicycle.ru/Travel \ website \ heihei.ru/ /opt/andrei/scripts/sites.sh

Два условия одновременно в Sed

Предположим, что у нас есть файл input.txt следующего содержания

Here is a String /b it has a Name Here is an Integer /b it has a Name Here is a Float /b it has a Name

Мы хотим отбросить всё, что находится левее /b, включая /b, и всё, что правее has.

Таким образом, в каждой строчке должно остаться только слово it.

Нужно учесть необходимость экранирования специального символа / а также мы хотим направить вывод в файл.

Источник

Читайте также:  Как установить статический ip windows 10
Оцените статью