Як уникнути однієї лапки у виразі sed, який уже оточений лапками?
Наприклад:
sed 's/ones/one's/' <<< 'ones thing'
Як уникнути однієї лапки у виразі sed, який уже оточений лапками?
Наприклад:
sed 's/ones/one's/' <<< 'ones thing'
Відповіді:
Цитати 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/'
Я не маю уявлення, чому \'б не працювати само по собі, але воно є.
Я знаю, що це буде звучати як коп, але я ніколи не міг змусити працювати, коли в рядку були як одинарні, так і подвійні лапки. Щоб допомогти таким новачкам, як я, які мають проблеми, один із варіантів - розділити рядок. Мені довелося замінити код у понад 100 файлах index.hmtl. Рядки мали як одинарні, так і подвійні лапки, тому я просто розділив рядок і замінив перший блок на,
<!--а другий блок на -->. Це зіпсувало мої файли index.html, але це спрацювало.
використовуйте альтернативний розділювач рядків на зразок ":", щоб уникнути плутанини з різними скісними рисками
sed "s:ones:one's:" <<< 'ones thing'
або якщо ви хочете виділити одну цитату
sed "s:ones:one\'s:" <<< 'ones thing'
обидва повертаються
one's thing