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


92

すでに引用符で囲まれているsed式で一重引用符をエスケープするにはどうすればよいですか?

例えば:

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


1
簡単な答えは「それはできませんです。提示された回避策はすべてうまく機能します。
グレンジャックマン2014

回答:


149

引用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 2016

sedコマンドを二重引用符で囲むと、それらのコマンドがシェルによって補間され、予期しない問題が発生する可能性があることに注意してください。
ポトン

38

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

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

two's thing

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

sed 's/ones/two'

\'

's/'

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


おそらくもっと簡単な変種:sed's / ones / two ''s /' <<< '
onesthing

@gregory:sed 's/ones/two''s/' <<< 'ones thing'いいえ、出力しますtwos thing'出力にがありません。あなたはこの答えで説明されている方法でそれをしなければなりません。
wisbucky

@wisbucky zshで使用しているsedのバージョン(FreeBSD / macOS)では、間違いなく「2つのもの」が出力されます。
グレゴリー

私に知らせて大いに助けてくれ、シェルはそれから縫い合わせる。
PrateekGupta19年

6

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

例えば:

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

3
Cスタイル$'string'はBash固有であるため、POSIXシェルに移植できません。
トリプリー2016

bash具体的ではありません。それはにも利用可能だkshzsh、しかし、はい、それはあなたがポータブルスクリプトを書いていない場合は罰金である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

ありがとう!私は正規表現が大好きで、sedが大好きで、今はあなたを愛しています<3
Gabriel A. Zorrilla

3

これはちょっとばかげていますが、私は仕事に入ることができませんでし\'sed 's/ones/one\'s/'。私はこれを調べて、Angularimport 'hammerjs';を使用してsrc/main.tsファイルに自動的に追加するシェルスクリプトを作成していました。

私が仕事に取り掛かったのはこれです:

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

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

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

なぜそれ\'だけでは機能しないのかわかりませんが、あります。



0

これは警官のように聞こえるでしょうが、文字列に一重引用符と二重引用符の両方が含まれていると、sedが機能することはありませんでした。私のような問題を抱えている初心者を助けるために、1つのオプションは文字列を分割することです。100を超えるindex.hmtlファイルのコードを置き換える必要がありました。文字列には一重引用符と二重引用符の両方が含まれていたため、文字列を分割して、最初のブロックを<!--に、2番目のブロックをに置き換えました -->。それは私の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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.