web-dev-qa-db-ja.com

sedで単一引用符を照合する方法

式が単一引用符で囲まれている場合に、sedで単一引用符を照合する方法:

sed -e '...'

たとえば、次のテキストと一致させる必要があります。

'foo'
35
grigy

次のいずれかを使用できます。

"texta'textb" (APOSTROPHE inside QUOTATION MARKs)

または

'texta'\''textb' (APOSTROPHE text APOSTROPHE, then REVERSE SOLIDUS, APOSTROPHE, then APOSTROPHE more text APOSTROPHE)

Unicode文字の名前を使用しました。 REVERSE SOLIDUSは、より一般的にはバックスラッシュとして知られています。

後者の場合、アポストロフィを閉じてから、バックスラッシュでアポストロフィをシェル引用し、残りのテキスト用に別のアポストロフィを開きます。

47
tzot

質問へのコメントで述べたように、それは本当にsedについてではなく、シェルの引用符付き文字列に引用符を含める方法(たとえば、bash)です。

以前の回答を明確にするために、引用符をバックスラッシュでエスケープする必要がありますが、単一引用符で囲まれた式の中でそれを行うことはできません。 bashのmanページから:

文字を単一引用符で囲むと、引用符内の各文字のリテラル値が保持されます。バックスラッシュが前に付いていても、一重引用符は一重引用符の間に出現しない場合があります。

したがって、引用符で囲まれた式を終了し、エスケープされた引用符を挿入して、新しい引用符で囲まれた式を開始する必要があります。シェルの引用の削除では余分なスペースが追加されないため、実際には文字列が連結されます。

したがって、式「foo」を単一引用符で囲む方法の元の質問に答えるには、次のようにします。

sed -e '...'\''foo'\''...'

(「...」はsed式の残りの部分です)。

全体として、読みやすくするために、可能な場合は、周囲の引用符を二重引用符に変更する方がはるかに良いでしょう。

sed -e "...'foo'..."

[最初の(単一引用符)アプローチの潜在的なメンテナンスの悪夢の例として、StackOverflowの構文が強調表示されている引用符、バックスラッシュ、およびその他のテキストの色に注意してください-それは間違いなく正しくありません。]

37
TimB