• ベストアンサー

sed で \ を含む文字列に置換

現在、非常に多数のドキュメントの整形を LaTeXを使って自動的に行っています。 問題となっている処理のエッセンスを抜き出すと次のようなもので、テンプレートファイル中の __PATTERN__ という文字列を、その都度指定する文字列($string)に置換した後にplatexでコンパイルする、という流れです。 ---------- #!/bin/bash sed "s/__PATTERN__/$string/" < template.tex > document.tex platex document.tex ---------- 問題は、$string に '_'(アンダーバー)が含まれるケースで、platexのコンパイルでエラーが発生します。 これを回避するには、'_' を '\_' に置換する必要がありますが、上記処理の前に、$string 中の '_' を '\_' に置換する処理を加えても、上記処理の段階で '\' が消えてしまいます。 肝は sed でのエスケープのやり方だと思うのですが、どうにもうまく行きませんので、お知恵を拝借できればと思います。 なお、tex ファイル中、__PATTERN__ は、他のコマンドの引数内で使用されているため、\verb+ + で囲むという手段も使えません。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

""中なら \ は \\ とクォートしないとダメですね. ちなみに「$string 中の '_' を '\_' に置換する」のはどんな処理ですか?

astronaut
質問者

補足

ありがとうございます。自己解決しました。 > ""中なら \ は \\ とクォートしないとダメですね. とのご回答のとおり、最後の置換で \ を一つ残すためには、事前に $string 中の '_' を '\\_' に置換する必要があり、このためには、 sed 's/_/\\\\\\\\_/g'` と、バックスラッシュを8個並べれば良いようです。 4個でいいと思っていてうまくいかないので質問したのですが、これで解決です。どうして8個必要になるのかがイマイチ理解できていませんが。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>どうして8個必要になるのか エスケープを処理するステップが何回もあるからです。 sed "s/__PATTERN__/$string/" なので、$string に8個の '\' があったとすると、 ・sed に渡されるのは4個の '\' になります。(1回目) ・さらに置換ルーチンに渡されるときに2個になります。(2回目) ・置換ルーチンがその2個の'\' を1個の'\'と解釈します。(3回目) →出力されるのは1つ というわけです。

関連するQ&A

  • sedでの置換がうまくできません。

    sedを使用して以下の様な文字列を置換したいと考えています。 iPar(\"w\") → 何かの文字列 そこで以下のようなsedスクリプトを作成しました。 s/iPar\(\"w\"\)/test/g  → a.sed 使用してみました。具体的には↓のコマンド >sed -f a.sed inputデータ >outputデータ しかし結果ファイルをみても何も変わってくれません。 なにが悪いのでしょうか? どなたかご指南下さい。

  • sedでカンマ区切りの列の置換を行いたい

    以下の様なファイルがあります。 sedコマンドを使用して、カンマで区切られたn番目のカラム目を 置換したい場合どうすればよいでしょうか。 "1","2","3","4","5","6" "1234","12","34567","abcd","efg","hi" "a c","d f","12 34","0","AAA","" "g i","j l","45 67","0","BBB","2021" "m o","p r","3 2 1","1","ABC","" "123","456","","abc","efg","hij" ①1カラム目以外置換(1カラム目以降削除) sed 's/\(.*\),.*,.*,.*,.*,.*/\1/g' test.csv ②最後の6カラム目以外置換(6カラム目以外削除) sed 's/.*,.*,.*,.*,.*,\(.*\)/\1/g' test.csv ③3カラム目を置換(3カラム目を「""」だけにしたい) sed -e 's/\(.*\),\(.*\),.*,\(.*\),\(.*\),\(.*\)/\1,\2,"",\3,\4,\5/g' test.csv とできたのですが、 表現がないというか、置換対象文字列の条件、表現が長いというか、全カラムを指定しているので、 少し、短くできないものでしょうか。 ①パターン sed 's/\([^,]*\),.*/\1/g' test.csv ②パターン sed "s/.*,\([^,]*\)$/\1/g" test.csv の様にできました。 ③パターン 思いう浮かばず これで、できているので間違いはないかとおもいますが、 どうなのでしょうか。 なにかいい案はないでしょうか?

  • 文字列置換

    UNIXのコマンドで文字列の置換を試みています。 今回行いたい置換としては。。。 12年 1986年2月12日 14 などの文字列を NUM年 NUM年NUM月NUM日 NUM などに、連続した数字をひとまとめにNUMに置換したいと考えています。 文字列の置換方法としてsedコマンドがあると聞いてしらべてみたのですが、いまいいち理解することができませんでした。 自分で考えて試してみたコマンドが以下の通りです。 sed -e "s/\([1-9]\{1,2,3,4\}\)/NUM/g" filename が・・・まったく置換はされませんでした。 よろしければお教えください。よろしくお願いいたします。

  • 【エクセル】文字列置換について

    エクセルでの文字列置換についてお教えください。 一部の文字列が含まれていたら、置換するという処理は可能ですか? 例えば、 ”ああああいいいい”  ”ああああうううう” ”ああああええええ” セルに、上記の文字列が、あったとして、 ”ああああ”が、含まれていたら、 すべてのセルを、”おおおお” に、置き換える(差し替える)という処理を想定しています。 よろしくお願いいたします。

  • sedの置換文字に変数を使用したいのですが・・・

    あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。 例: X="a" Y="b" echo test.txt | sed 's/${X}/${Y/g}' >test.txt sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

  • 長い文字列の置換を出来るエディタを教えてください。

    数式Texのコマンドなんですが、1000文字の文字列を1500文字の文字列に置換しようとしたところ、255バイト以上のデータはきられてしまい、正常に置換できませんでした。 秀丸、Wordのソフトウェアや複数行置換のフリーウェアを探したのですが、正常に置換できませんでした。 このように1000文字を1500文字への置換等、長い文字列を置換できるソフトウェアがあれば教えてください。

  • sedで置換対象となる文字列の制限は変更できますか?

    こんにちは。 今、あるファイル(30個)の1行が45000以上あります。 このファイルの中の文字列を一括置換したいと思い、 sed文にて行ってみましたが、 "input line too long”とメッセージが出て置換が出来ません。 対象のファイルの1行を40959に短くして、実験したところ、置換できました。 この45000以上の文字列置換を実現させるには、何か良い方法がありますでしょうか? 環境は、OS:xp、MKSを使っています。 よろしくお願いします。

  • 文字列の置換

    お世話になります。 このような文字列置換可能でしょうか '&nbsp;&nbsp;|&nbsp;&nbsp;<a href=・・・>(・・・' ・・・は、任意の文字列 を '&nbsp;&nbsp;<a href=・・・>(・・・' と、いうようにです。 つまり、文字列の中に'|&nbsp;&nbsp;'と、'('が有ったら、 '|&nbsp;&nbsp;'のみを取り除いた文字列を作成する と、いうことです。 そして、文字列中に同様なパターンが複数回有れば、同時に全てを同様に処理したいのですが。 よろしくお願いいたします。

  • ファイル内の文字列を置換

    掲示板利用させていただきます。 現在、ファイル内の特定の文字列を置換し、 保存する方法を探しています。 できればスクリプト言語を利用したいと考えています。 sedコマンドを使用して文字列置換を行ったのですが 置換前と置換後のファイルで 文字コードと改行コードが変わってしまうのでダメでした; 「ファイル内の特定の文字列を任意の文字列に置換し、置換前と置換後で改行コードと文字コードを変えない方法」 をご存知の方、ご教示ください。 bash,perl,javaのどれでも結構です。 よろしくおねがいします。

  • 文字列の置換で・・・

    Javaでの文字列の置換についてなんですが ある文字を任意の文字に置換し表示させるとともに 何個の文字を置換したかも同時に知らせたい場合は どのような処理をしたらよいでしょうか? ぜひご協力よろしくお願いします!! (例)入力した文字列に"a"が含まれる場合は"b"に置換し   その際に変換した文字数も表示してください。     basic→出力結果: "bbsic" 置換した文字数は1です。

    • ベストアンサー
    • Java