Як уникнути однієї лапки у виразі 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