以下は、電子メールアドレス文字列の周りの引用符を削除します。
$ echo "[email protected]" | sed 's/"([^"]*)"/\0/g'
[email protected]
しかし、もし:
$ cat ~/Desktop/emails.txt
"[email protected]"
$ sed 's/"([^"]*)"/\0/g' ~/Desktop/emails.txt
"[email protected]"
$ sed -i '' 's/"([^"]*)"/\0/g' ~/Desktop/emails.txt
$ cat ~/Desktop/emails.txt
"[email protected]"
同じ文字列を含むファイルを使用してまったく同じsed正規表現置換を適用しようとすると、機能しません。
私は何が間違っていましたか?
ベストアンサー1
申し訳ありません。あなたのecho
例はうまくいきません。二重引用符("
)は解釈され渡さbash
れないため、機能しているようですsed
。
次の2つの例の違いを確認してください。
$ echo "[email protected]"
[email protected]
$ echo "\"[email protected]\""
"[email protected]"
あなたのecho
コマンドは提供されていないので、削除する入力文字列に何もないので"
動作するようです。sed
"
"
この例は、正しくエスケープしようとするとecho
機能しませんfile
。
$ echo "\"[email protected]\"" | sed 's/"([^"]*)"/\0/g'
"[email protected]"
コマンドsed
には2つのエラーがあります。
- 拡張正規表現構文を使用しています。 sedがある場合にのみ使用できます
gnu
。違いは括弧を使用する方法です。 - で始まる逆参照を計算する必要があります
1
。
したがって、正しいコマンドは次のようになります。
echo "\"[email protected]\"" | sed 's/"\([^"]*\)"/\1/g'
またはsed
拡張正規表現をサポートする場合:
echo "\"[email protected]\"" | sed -E 's/"([^"]*)"/\1/g'