• ベストアンサー

sedで\を含む文字列へ変換

テキストファイルの中で zeta0 となっている部分を \zeta_0^p へ一括して変換したいのですが、 tex でコンパイルできるソースに変換するために ネット上の情報を参考にして $ sed -e "s/zeta0/\zeta_0^p/" 01.tex > 02.tex $ sed -e "s/zeta0/\\\zeta_0^p/" 01.tex > 02.tex $ sed -e "s/\zeta0\/\\\zeta_0^p\/" 01.tex > 02.tex $ sed -e "s/zeta0/\\\zeta_0^p&/g" 01.tex > 02.tex などとやってみましたが、どれもうまくいきません。 どう書けばうまくいきますか? 教えて下さい。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

sed -e "s/zeta0/\\\zeta_0^p/" 01.tex > 02.tex 一応、これでも動くはずですが。 どのように「うまくいきません」なのでしょうか? 引数の作り方ですが まず、sedに送りたい文字列を考えます s/zeta0/\\zeta_0^p/ \は、sedで解釈されて、メタ文字の切り替えや引用等に使われます。 そのため、\という文字を扱うには\\とする必要があります。 次に、シェルで、上記文字列を表現する方法を考えます。 ダブルクオートは、\によるエスケープシーケンスを解釈して置換します。 そのため、\という文字を扱うには\\とする必要があります。 "s/zeta0/\\\\zeta_0^p/" ※ 3つでも動いたのは、 ダブルクオートの場合は\zというシーケンスが無く、変換されずに残ったためです。 ですが、この文字列の中では、変数展開などを使っていません。 ならば、シングルクオートを使えば、特殊文字の展開やエスケープを考えずに済みます 's/zeta0/\\zeta_0^p/' set -x と入力したあと各コマンドを実行すると、上記のシェルによる置き換え後のコマンドラインが表示されるので、自分の期待る文字列になっているか確認できます。 シェルの種類によっては、上記の展開が違う場合もあります。

noname#197096
質問者

お礼

昨日は zeta0 aaazeta0aa aazeta0aa zeta0 という内容の4行のファイルを質問の中で書いたコマンド群で変換すると zeta_0^p aaazeta_0^paa aazeta_0^paa zeta_0^p となっていたのです。 今 sed -e "s/zeta0/\\\zeta_0^p/" 01.tex > 02.tex のコマンドを打つと こちらが期待したように変換してくれました。 昨日はどこかミスをしていたのかもしれません。 上記の内容は完全には理解できませんでしたが、 おかげさまで勉強になりました。 http://okwave.jp/qa/q3340542.html を参照して変数展開もできるようになりました。 どうもありがとうございました。

関連するQ&A

専門家に質問してみよう