Как избежать одиночной кавычки в 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/'

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



0

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


0

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

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


0

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

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

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

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

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

one's thing
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.