ファイル内の引用符をsedで置き換える方法は?


10

複数行のxmlを含むファイルがあります。ファイルの特定の部分を置き換えたいのですが。ファイルの一部に引用符(")が含まれていますが、これを置き換えます。私はで引用符をエスケープしようとしました\これは私のファイルの結果に基づいて機能しているとは思いません。

これが私のsedコマンドの例です:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

これは、sedコマンドで引用符をエスケープする方法ですか、それとも私は何か間違っていますか?


2
あなたのコマンドでは、交換のために右に見える"text"'text'。もちろん、それは何もしません"othertext"。いくつかの入力行と対応する望ましくない出力を表示し、代わりに必要な出力を説明します。
Gilles 'SO-悪をやめる'

だから、\"sedコマンドで引用符をエスケープする正しい方法はありますか?
jbranchaud 2011年

4
sedは対象外:sedはエスケープを必要とせず、サポートもしません"。しかし、あなたのシェルコマンドは二重引用符で囲まれた文字列を使用しており、\"そこで正しいです。sedプログラムは見ることs/"text"/'text'/igの引数として-e
Gilles「SO-邪悪なことをやめなさい」

@ギレススペースはどうですか?sedは空白を理解し、尊重していますか?たとえば、コマンドに次のスペースが含まれている場合s/\"text\" /'text'/igのみ検索さ"text" れますか?
jbranchaud 2011年

3
スペースは完全に一致する必要があります。この対話を続けるのではなく、いくつかのサンプル入力と対応する必要な出力を投稿することをお勧めします(おそらく、引用を変更する必要がある理由を説明します)。それsedがその仕事に適したツールであるかどうかさえはっきりしていません。おそらくXMLパーサーが必要でしょう。
Gilles 'SO-悪をやめる'

回答:


11

2つのヒント:

  1. 単一引用符で囲まれた文字列内の単一引用符はエスケープできません。したがって、引用符を閉じ、エスケープされた引用符を追加してから、もう一度引用符を開く必要があります。つまり'foo'\''bar'、次のように分解されます。

    • 'foo'        引用 foo
    • \'             脱出した '
    • 'bar'        引用 bar

    降伏foo'bar

  2. (オプション)必ずしも/sedで使用する必要はありません。同じsed式でを使用する/\、読みにくくなることがわかりました。

たとえば、このファイルから引用符を削除するには:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

上記の2つのヒントを考えると、二重引用符と単一引用符の両方を削除するために使用できるコマンドは次のとおりです。

$ sed -e 's|["'\'']||g'  /tmp/f

最初のヒントに基づいて、シェルはsedの2番目の引数(つまり、の後の文字列-e)をに減らし、その文字s|["']||g列をsedに渡します。2番目のヒントに基づいて、sedはこれをと同じように扱いs/['"]//gます。その意味は

'またはに一致するすべての文字を削除します"   (つまり、何も置き換えません)

おそらく、あなたが望むことを行うには、これよりも複雑なものが必要ですが、それは始まりです。


1
2番目のヒントにさらに細かいポイントを付けます。sコマンドとyコマンドを使用する場合、特に/の代わりに任意の文字を使用できます。他のsedコマンドで正規表現を使用する場合、最初の区切り文字(/の代替を使用する場合)はエスケープする必要があります。正規表現内で一致させる場合は、優先する区切り文字もエスケープする必要があります。
Eli Heady

面倒になることなく、単一引用符と二重引用符を混在させることは困難です。一重引用符をエスケープするのではなく二重引用符で囲むと、引用符で囲むと読みやすいと感じる人もいます。したがって、ではなく'foo'\''bar'、を使用する場合があります'foo'"'"'bar'
スコット

1

UNIXユーティリティのWindows移植版があるため、コマンドは少し異なりますが、カンマと引用符が含まれたcsvファイルがありました。このスレッドをガイドとして使用して、次のコマンドで引用符を削除することができました。

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"

ありがとう!これにこだわった!
sendbits
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.