web-dev-qa-db-ja.com

sedで一重引用符をエスケープする方法は?

すでに引用符で囲まれているsed式の単一引用符をエスケープする方法は?

例えば:

sed 's/ones/one's/' <<< 'ones thing'
69
Thomas Bratt

二重引用符でsedコードを引用する:

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

何百ものバックスラッシュでコードをエスケープするのは好きではありません。通常、私はこのようにします:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing
120
Kent

1つのトリックは、隣接する文字列のシェル文字列連結を使用し、シェルエスケープを使用して埋め込み引用符をエスケープすることです:

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

two's thing

Sed式には3つの文字列があり、シェルはそれらをつなぎ合わせます。

sed 's/ones/two'

\'

's/'

それが他の誰かを助けることを願っています!

31
Thomas Bratt

最良の方法は、$'some string with \' quotes \''を使用することです

例えば:

sed $'s/ones/two\'s/' <<< 'ones thing'
6
John C

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

文字列内に単一のand二重引用符がある場合、それも問題ありません。二重引用符をエスケープするだけです。

たとえば、このファイルには一重引用符と二重引用符の両方を含む文字列が含まれています。 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

これは一種のばかげたことですが、\'sed 's/ones/one\'s/'を機能させることができませんでした。これを見て、Angularでimport 'hammerjs';ファイルにsrc/main.tsを自動的に追加するシェルスクリプトを作成しました。

私が仕事に着いたのはこれです:

apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts

したがって、上記の例では、次のようになります。

apost=\'
sed 's/ones/one'$apost's/'

\'が単独では機能しない理由はわかりませんが、問題はあります。

1
Ambrown

これは警官のように聞こえるかもしれませんが、文字列に一重引用符と二重引用符の両方が含まれていると、sedが機能しません。問題を抱えている私のような初心者を助けるために、1つのオプションは文字列を分割することです。 100個を超えるindex.hmtlファイルのコードを置き換える必要がありました。文字列には一重引用符と二重引用符の両方が含まれていたため、文字列を分割し、最初のブロックを<!--で、2番目のブロックを-->で置き換えました。それは私のindex.htmlファイルの混乱を作りましたが、うまくいきました。

0
mcmacerson