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

92

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

Например:

sed 's/ones/one's/' <<< 'ones thing'
Томас Братт
источник
1
Короткий ответ - « вы не можете этого сделать » - все представленные обходные пути работают хорошо.
Гленн Джекман 01

Ответы:

150

Quote sedкоды в двойные кавычки:

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing

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

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing
Кент
источник
7
Кажется, это не работает по sed -iкакой-либо конкретной причине?
SamAko
Следует отметить, что окружающие команды sed двойными кавычками позволяют интерполировать эти команды оболочкой и могут привести к непредвиденным проблемам.
потонг,
38

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

sed 's/ones/two'\''s/' <<< 'ones thing'

two's thing

В выражении sed есть 3 строки, которые оболочка затем сшивает:

sed 's/ones/two'

\'

's/'

Надеюсь, это поможет кому-то другому!

Томас Братт
источник
возможно, более простой вариант: sed 's / one / two''s /' <<< 'one thing'
gregory
@gregory: sed 's/ones/two''s/' <<< 'ones thing'Нет, это выводит twos thing. На 'выходе отсутствует. Вы должны сделать это так, как описано в этом ответе.
wisbucky
@wisbucky С версией sed, которую я использую (FreeBSD / macOS) на zsh, она определенно выводит "двойки".
Gregory
большой помощник, давая мне знать, оболочка затем сшивается.
Prateek Gupta
6

Лучше всего использовать $'some string with \' quotes \''

например:

sed $'s/ones/two\'s/' <<< 'ones thing'
Джон К
источник
3
Стиль C $'string'специфичен для Bash, поэтому он не переносится в оболочку POSIX.
Tripleee
Это не bashконкретно. Он также доступен в kshи zsh, но да, это расширение POSIX, что нормально, если вы не пишете переносимый скрипт. Единственным недостатком является то, что вам нужно избегать любых других используемых вами обратных косых черт.
dannyw
6

Просто используйте двойные кавычки вне команды 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, и теперь я люблю тебя <3
Габриэль А. Зоррилла
3

Это своего рода абсурдным , но я не мог получить \'в 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/'

Понятия не имею, почему \'бы не работать сам по себе, но вот он.

Ambrown
источник
0

Я знаю, что это будет звучать как отговорка, но я никогда не мог заставить sed работать, когда в строке были как одинарные, так и двойные кавычки. Чтобы помочь таким новичкам, как я, у которых возникают проблемы, можно разделить строку. Мне пришлось заменить код более чем в 100 файлах index.hmtl. Строки имели как одинарные, так и двойные кавычки, поэтому я просто разделил строку и заменил первый блок на, <!--а второй - на -->. Это испортило мои файлы index.html, но это сработало.

McMacerson
источник
0

Некоторые побеги на терминалах AppleMacOSX не работают так:

sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'

PaSe
источник
0

используйте альтернативный разделитель строк, например ":", чтобы избежать путаницы с разными косыми чертами

sed "s:ones:one's:" <<< 'ones thing'

или если вы хотите выделить одинарную кавычку

sed "s:ones:one\'s:" <<< 'ones thing'

оба возвращаются

one's thing
мозгэлектроника
источник