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