Кажется, это не работает по sed -iкакой-либо конкретной причине?
SamAko
Следует отметить, что окружающие команды sed двойными кавычками позволяют интерполировать эти команды оболочкой и могут привести к непредвиденным проблемам.
потонг,
38
Один из приемов состоит в том, чтобы использовать конкатенацию соседних строк в строке оболочки и избежать встроенной кавычки с помощью экранирования оболочки:
sed 's/ones/two'\''s/' <<< 'ones thing'
two's thing
В выражении sed есть 3 строки, которые оболочка затем сшивает:
возможно, более простой вариант: 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 \''
Стиль C $'string'специфичен для Bash, поэтому он не переносится в оболочку POSIX.
Tripleee
Это не bashконкретно. Он также доступен в kshи zsh, но да, это расширение POSIX, что нормально, если вы не пишете переносимый скрипт. Единственным недостатком является то, что вам нужно избегать любых других используемых вами обратных косых черт.
dannyw
6
Просто используйте двойные кавычки вне команды sed.
$ sed "s/ones/one's/" <<< 'ones thing'
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/'
Понятия не имею, почему \'бы не работать сам по себе, но вот он.
Я знаю, что это будет звучать как отговорка, но я никогда не мог заставить sed работать, когда в строке были как одинарные, так и двойные кавычки. Чтобы помочь таким новичкам, как я, у которых возникают проблемы, можно разделить строку. Мне пришлось заменить код более чем в 100 файлах index.hmtl. Строки имели как одинарные, так и двойные кавычки, поэтому я просто разделил строку и заменил первый блок на,
<!--а второй - на -->. Это испортило мои файлы index.html, но это сработало.
Ответы:
Quote
sed
коды в двойные кавычки:Не люблю экранировать коды сотнями обратных косых черт - глаза режут. Обычно я поступаю так:
источник
sed -i
какой-либо конкретной причине?Один из приемов состоит в том, чтобы использовать конкатенацию соседних строк в строке оболочки и избежать встроенной кавычки с помощью экранирования оболочки:
sed 's/ones/two'\''s/' <<< 'ones thing'
В выражении sed есть 3 строки, которые оболочка затем сшивает:
sed 's/ones/two'
\'
's/'
Надеюсь, это поможет кому-то другому!
источник
sed 's/ones/two''s/' <<< 'ones thing'
Нет, это выводитtwos thing
. На'
выходе отсутствует. Вы должны сделать это так, как описано в этом ответе.Лучше всего использовать
$'some string with \' quotes \''
например:
источник
$'string'
специфичен для Bash, поэтому он не переносится в оболочку POSIX.bash
конкретно. Он также доступен вksh
иzsh
, но да, это расширение POSIX, что нормально, если вы не пишете переносимый скрипт. Единственным недостатком является то, что вам нужно избегать любых других используемых вами обратных косых черт.Просто используйте двойные кавычки вне команды sed.
Он также работает с файлами.
Если внутри строки есть одинарные и двойные кавычки, это тоже нормально. Просто избегайте двойных кавычек.
Например, этот файл содержит строку с одинарными и двойными кавычками. Я использую sed, чтобы добавить одинарную кавычку и удалить некоторые двойные кавычки.
источник
Это своего рода абсурдным , но я не мог получить
\'
вsed 's/ones/one\'s/'
к работе. Я искал это, чтобы создать сценарий оболочки, который автоматически добавитсяimport 'hammerjs';
в мойsrc/main.ts
файл с помощью Angular.Вот что я сделал:
Итак, для приведенного выше примера это будет:
Понятия не имею, почему
\'
бы не работать сам по себе, но вот он.источник
Я знаю, что это будет звучать как отговорка, но я никогда не мог заставить sed работать, когда в строке были как одинарные, так и двойные кавычки. Чтобы помочь таким новичкам, как я, у которых возникают проблемы, можно разделить строку. Мне пришлось заменить код более чем в 100 файлах index.hmtl. Строки имели как одинарные, так и двойные кавычки, поэтому я просто разделил строку и заменил первый блок на,
<!--
а второй - на-->
. Это испортило мои файлы index.html, но это сработало.источник
Некоторые побеги на терминалах AppleMacOSX не работают так:
sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'
источник
используйте альтернативный разделитель строк, например ":", чтобы избежать путаницы с разными косыми чертами
или если вы хотите выделить одинарную кавычку
оба возвращаются
источник