Як уникнути однієї лапки в sed?


92

Як уникнути однієї лапки у виразі sed, який уже оточений лапками?

Наприклад:

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


1
Коротка відповідь: " Ви цього не можете зробити " - обхідні шляхи добре представили всі роботи.
glenn jackman

Відповіді:


151

Цитати 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 / ones / two''s /' <<< 'ones thing'
gregory

@gregory: sed 's/ones/two''s/' <<< 'ones thing'Ні, це виводить twos thing. У 'виході відсутнє значення . Ви повинні зробити це так, як описано у цій відповіді.
Wisbucky

@wisbucky З версією sed, яку я використовую (FreeBSD / macOS) на zsh, вона точно видає "дві речі".
Григорій

велика допомога, давши мені знати, оболонка потім зшиває.
Пратеек Гупта

7

Найкращий спосіб - використовувати $'some string with \' quotes \''

наприклад:

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

3
Стиль C $'string'є специфічним для Bash, тому він не переноситься на оболонку POSIX.
триплі

Це не 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

Дякую! Я люблю регулярні вирази, люблю сед і тепер люблю тебе <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

Я знаю, що це буде звучати як коп, але я ніколи не міг змусити працювати, коли в рядку були як одинарні, так і подвійні лапки. Щоб допомогти таким новачкам, як я, які мають проблеми, один із варіантів - розділити рядок. Мені довелося замінити код у понад 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.