アプリ版:「スタンプのみでお礼する」機能のリリースについて

テキストファイルの中で
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

などとやってみましたが、どれもうまくいきません。
どう書けばうまくいきますか?

教えて下さい。
よろしくお願いします。

A 回答 (1件)

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 と入力したあと各コマンドを実行すると、上記のシェルによる置き換え後のコマンドラインが表示されるので、自分の期待る文字列になっているか確認できます。
シェルの種類によっては、上記の展開が違う場合もあります。
    • good
    • 0
この回答へのお礼

昨日は

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
を参照して変数展開もできるようになりました。
どうもありがとうございました。

お礼日時:2014/06/14 10:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!