- Глава 5. Кавычки
- Какие символы мне нужно экранировать при использовании sed в скрипте sh?
- unixforum.org
- sed. экранировать одинарную кавычку в переменной
- sed. экранировать одинарную кавычку в переменной
- Re: sed. экранировать одинарную кавычку в переменной
- Re: sed. экранировать одинарную кавычку в переменной
- Re: sed. экранировать одинарную кавычку в переменной
- Re: sed. экранировать одинарную кавычку в переменной
- Re: sed. экранировать одинарную кавычку в переменной
- Re: sed. экранировать одинарную кавычку в переменной
- Re: sed. экранировать одинарную кавычку в переменной
- Linux sed экранирование кавычек
- Основные команды Sed
- Замена слова в файле
- Замена слова в файле и вывод результата в другой файл
- Замена слова в нескольких файлах одновременно
- Отбросить всё, что левее определённого слова
- Отбросить всё, что правее определённого слова
- Экранирование символов в sed
- Два условия одновременно в Sed
Глава 5. Кавычки
Кавычки, ограничивающие строки с обеих сторон, служат для предотвращения интерпретации специальных символов, которые могут находиться в строке. (Символ называется «специальным», если он несет дополнительную смысловую нагрузку, например символ шаблона — * .)
в консол и вку́пе (с чем-либо) в общем в ообще | в течени е (часа) нович ок нюанс п о умолчанию | приемл емо пробле ма проб овать тра фик |
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
Специальные символы экранируются с помощью \ ;
Что включать в специальные символы зависит от того, какой sed вы используете, но $.*[\^ а также пробелы и кавычки советую экранировать всегда.
Пробел также можно заменять на \s
. в регулярных выражениях обозначает один любой символ кроме начала новой строки \n поэтому, если вы хотите написать url используйте \
Пример экранирования точек и кавычек для смены локали в 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.
Нужно учесть необходимость экранирования специального символа / а также мы хотим направить вывод в файл.
Источник