Как избежать одиночной кавычки в выражении sed, которое уже заключено в кавычки?
Например:
sed 's/ones/one's/' <<< 'ones thing'
Как избежать одиночной кавычки в выражении sed, которое уже заключено в кавычки?
Например:
sed 's/ones/one's/' <<< 'ones thing'
Ответы:
Quote sed
коды в двойные кавычки:
$ sed "s/ones/one's/"<<<"ones thing"
one's thing
Не люблю экранировать коды сотнями обратных косых черт - глаза режут. Обычно я поступаю так:
$ sed 's/ones/one\x27s/'<<<"ones thing"
one's thing
sed -i
какой-либо конкретной причине?
Один из приемов состоит в том, чтобы использовать конкатенацию соседних строк в строке оболочки и избежать встроенной кавычки с помощью экранирования оболочки:
sed 's/ones/two'\''s/' <<< 'ones thing'
two's thing
В выражении sed есть 3 строки, которые оболочка затем сшивает:
sed 's/ones/two'
\'
's/'
Надеюсь, это поможет кому-то другому!
sed 's/ones/two''s/' <<< 'ones thing'
Нет, это выводит twos thing
. На '
выходе отсутствует. Вы должны сделать это так, как описано в этом ответе.
Лучше всего использовать $'some string with \' quotes \''
например:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
специфичен для Bash, поэтому он не переносится в оболочку POSIX.
bash
конкретно. Он также доступен в ksh
и zsh
, но да, это расширение POSIX, что нормально, если вы не пишете переносимый скрипт. Единственным недостатком является то, что вам нужно избегать любых других используемых вами обратных косых черт.
Просто используйте двойные кавычки вне команды sed.
$ sed "s/ones/one's/" <<< 'ones thing'
one's thing
Он также работает с файлами.
$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing
Если внутри строки есть одинарные и двойные кавычки, это тоже нормально. Просто избегайте двойных кавычек.
Например, этот файл содержит строку с одинарными и двойными кавычками. Я использую sed, чтобы добавить одинарную кавычку и удалить некоторые двойные кавычки.
$ cat testfile
"it's more than ones thing"
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile
$ cat testfile
it's more than one's thing
Это своего рода абсурдным , но я не мог получить \'
в sed 's/ones/one\'s/'
к работе. Я искал это, чтобы создать сценарий оболочки, который автоматически добавится import 'hammerjs';
в мой src/main.ts
файл с помощью Angular.
Вот что я сделал:
apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts
Итак, для приведенного выше примера это будет:
apost=\'
sed 's/ones/one'$apost's/'
Понятия не имею, почему \'
бы не работать сам по себе, но вот он.
Я знаю, что это будет звучать как отговорка, но я никогда не мог заставить sed работать, когда в строке были как одинарные, так и двойные кавычки. Чтобы помочь таким новичкам, как я, у которых возникают проблемы, можно разделить строку. Мне пришлось заменить код более чем в 100 файлах index.hmtl. Строки имели как одинарные, так и двойные кавычки, поэтому я просто разделил строку и заменил первый блок на,
<!--
а второй - на -->
. Это испортило мои файлы index.html, но это сработало.
используйте альтернативный разделитель строк, например ":", чтобы избежать путаницы с разными косыми чертами
sed "s:ones:one's:" <<< 'ones thing'
или если вы хотите выделить одинарную кавычку
sed "s:ones:one\'s:" <<< 'ones thing'
оба возвращаются
one's thing