awkで¥をエスケープする方法

このQ&Aのポイント
  • awkを使用して文字列置換を行う際に、変数内の¥マークを正しくエスケープする方法を教えてください。
  • 質問者は、awkを使用した文字列置換で¥マークを使うと正常に置換されない問題に遭遇しています。解決策を教えてください。
  • 質問者は、awkで¥マークを使った文字列置換を行いたいが、正しく置換されない問題に直面しています。解決策をお教えください。
回答を見る
  • ベストアンサー

awkで¥をエスケープする方法

awkで以下のように文字列置換したいのですが、変数strA内で¥マークを使用すると正常に置換してくれません。どのようにエスケープすれば良いのでしょうか? ================================================= --実行コマンド---------- gawk -f CNV.awk input.txt --input.txt---------------- いぬ¥ねこ --CNV.awk---------------- strA="ぬ¥ね"; strB="★"; gsub(strA, strB, $0); print $0; ================================================= このとき、「い★こ」という結果を期待しているのですが出力がありません。 また、 strA="ぬ¥¥ね"; や strA='ぬ¥ね'; と指定しても同様にダメでした。 どなたか解決策をご存知でしたらご教授宜しくお願い致します。

  • Ruby
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
回答No.1

strA="ぬ\\\\ね"; 代入する時、正規表現、で評価されるようです。 または、 gsub(/ぬ\\ね/, strB, $0);

urahyster
質問者

お礼

前者の方法でうまくいきました! 有難うございました!

その他の回答 (1)

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

そもそも、awkのスクリプトとして変じゃないですか? 省略可能なパターン {アクション} の繰り返しのはずなのに、{}が一つもないのですから。少なくとも、こちらでやったらSytax Errorになります。 また、全体を{}で囲めば、「い★こ」という結果になりました。 あとは、awkだと文字コードの変換まではやってくれないと記憶してます。なので、あらかじめ揃えておく必要があるでしょうし、いわゆる「ダメ文字」問題もあるでしょう。 一番の間違いは、ここはRubyカテゴリーだということですけど。

関連するQ&A

  • awkのgsubによる置換

    awkのgsubで置換をしているのですが、置換後、全体をprintするため $0で出力したところ、セパレータがカンマ区切りから半角スペースに なってしまいます。 置換されなかった場合は、何事もなくそのまま出力されます。 これは、そのようなものなのでしょうか もし、カンマ区切りで出力したい場合は、ループなどで繰り返して 出す以外ないのでしょうか gawk -F"," '{if ($5=="1") {gsub($2,'abc',$2); print $0} else {print $0}}' hoge.txt

  • awk と gawk の書き方の違い

    PCでAWKコマンドを使いたくてgawkを使ってみたのですが、 やっぱりawkのような書き方では上手く実行できないみたいです。 gawkのバージョンは v3.1.6です。 コマンド (awk) awk -F, '{printf("copy aaa\%s bbb\%sn",$0,$0)}' list.txt 単純にDOSのバッチをファイルから作りたいだけなのですが・・・gawkではどのように書けば良いのか教えてください。お願いします。 仕事でUNIXを使っていたのですがPCに移行するという話がでていて、今までのunixコマンドをPCで動くようにソースを書き直して行かなくてはならないのにパスを『/』から『\』にしただけでは全く動きませんでした。やっぱりUNIXのawkでは出来てPCのgawkでは出来ないこともあるのでしょうか?それとも書き方の問題でしょうか??

  • awkで単語単位での置換

    awkを使って単語単位の置換を行いたいのですが、うまく行きません。 awkで単語単位で置換を行うのにはどの様にすれば宜しいのでしょうか? 何方かご存知の方いらっしゃいましたらご教授願います。 具体的にはsedの以下のコマンドと同等の事をawkで行いたいと思っています。 sed 's/\b置換前の単語\b/置換後の単語/g' 例: ・ファイルの内容 hogehoge abcdefg hogehoge hogehoge bcdef hogehoge hogehoge bcd hogehoge hogehoge abcd hogehoge hogehoge bcd hogehoge bcdef bcd hogehoge 上記ファイルをawkで1行ずつ読み込みの3,5,7行目の”bcd”のみ”HIJ”に置き換える事をしたいと考えています。 下記を試してみたのですが、うまく行きませんでした。 1.awk '{gsub(/\bbcd\b/, "HIJ", $0); print $0}' 2.awk '{gsub(/(bcd)/, "HIJ", $0); print $0}' 1だと全く置換されず、2だと3,5,7行目以外も置換されてしまいます。 どの様にしたらうまく行くのでしょうか?

  • PowerShell で bash の awk 的な事

    PowerShellで下記のコマンドと同じような事がしたいです。 どのたかご教示ください。 awk '{print $1}' hoge.txt awk -v str="${hoge}" '{if($1==str) print $0}' hoge.txt awk '{print length($1)}' ヒントでも構いません、 よろしくお願い致します。

  • unixのawkについて

    unixでawkを使ってフルパスからディレクトリとファイル名に分けようと しているのですが、上手くいきません。 例えば ①/aaa/bbb/ccc ②/111/222/333/hoge.txt ③/hoge/foo/bar/dk@0:1 を ①/aaa/bbb と ccc ②/111/222/333 と hoge.txt ③/hoge/foo/bar と dk@0:1 としたいのです。 echo "/111/222/333/hoge.txt" | gawk '{sub(/\/.*$/,"",$0); print}' としてみたのですが、 ディレクトリだけを取り出そうとしたのですが上手くいきません。 よろしくお願いします。 OSは、Solaris、Linuxになります。

  • awk 正規表現を使って置換

    あるファイルの中の2列目に含まれる "ab" "ac" "ae" という文字列をそれぞれ "zb" "zc" "ze"に置き換えたいのですが、awkまたはsedで正規表現を使って効率のいい方法はないでしょうか。 awk ' { gsub(/ab/,"zb",$2); gsub(/ac/,"zc",$2); gsub(/ae/,"ze",$2); print }' testfile でやりたいことはできるのですが、「aの後にb,c,eが続く場合にaをzに置換する」というアイディアを使えばもっと効率のよいスクリプトが書けるはず、と思いつつ、awkの勉強を始めたばかりでなかなか思い浮かびません。 testfileの中身は以下の通り: abcde abaab aaaae acbec accee adabd dceba aeecs hhhgf sbacc 以下のような出力を望んでいます: abcde zbazb aaaae zcbec accee adzbd dceba zeecs hhhgf sbzcc awk ' BEGIN { var = "[bce]" } { gsub("a"var,"z"var,$2); print }' だと "zb" "zc" "ze"ではなくすべて"z[bce]"に置き換わってしまうし、 awk ' BEGIN { var = "[bce]" } { gsub("a"var,"z&",$2); print }' だと"zab" "zac" "zae"になってしまうし… まずはawk,sedで勉強したいと思っていますが、それ以外でもいい案がありましたら教えてください。よろしくお願いします。

  • 今、awkを使ったシェルスクリプトを作っています。

    今、awkを使ったシェルスクリプトを作っています。 aaa bbb ccc ddd ee ff gggg hhh といったファイルから、 bbb,ccc ff,gggg を取り出したいと思っています。 そこで、以下のコマンドをwhileでまわして、$iを増加させることにより、 ファイルを一行ずつ読み取り、目的の列を取り出したく思っています。 A=`cat sample.txt|awk 'NR == $i {print NR, $2;}'` B=`cat sample.txt|awk 'NR == $i {print NR, $3;}'` ところが、awkコマンドの中の$iがシングルクォーテーションでくくられているので、 変数展開されなくて困っています。 何かよい方法があればご教授いただけますでしょうか?

  • awkの入力ファイルをリダイレクト先にする方法

    ---------hoge.txt--------- hoge hoge hoge ------------------------- 等としておいて、 $ awk '{print NR":"$1;}' hoge.txt とすると標準出力に ------------------------- 1:hoge 2:hoge 3:hoge ------------------------- と表示されますが、これを $ awk '{print NR":"$1;}' hoge.txt > hoge.txt と自分自身にリダイレクトするとhoge.txtは空になってしまいます。 hoge.txtに上の標準出力を上書きするにはどのように書けば良いのでしょうか、教えてください。 awkだけでなく、テキストファイルを入力にできるコマンド一般についても 上記のようなことができる方法があれば、教えていただきたいです。

  • Bシェルのawkコマンドについて

    Bシェルのawkコマンドについてですが、例えばプロンプトから % ls -l hoge.txt | awk '{print $5}' と入力すると、hoge.txtのファイルサイズが出力されますが、同様のことをBシェルの中で行おうと思っています。 下記のように、配列arrayにはスペース区切りで3つのデータが入っており、N番目のデータを取得したいという場合に、Nに変数を使用して取得する方法がわかりません。 #!/bin/sh array="AA BB CC" num=3 # CCを取得したい echo $array | awk '{print $num}' 上記で実行すると、"AA BB CC"のようにすべて出力されてしまいます。awkで出力する箇所を${数値}で指定すればうまくいくのですが、ランダムで決めた数値(1~3)をnumに入れて取得したい場合、このようなことは可能でしょうか。 もし不可能な場合でも、awk以外に何かコマンドがあればご教授願います。なお、作成するのはBシェルになります。

  • DOSプロンプトでリダイレクションでファイルから入力した文字を表示したい

    標準入力から入力があるプログラムをDOSバッチでテストする為、 入力文字をファイルにしてリダイレクションで入力させています。 入力はされてそれなりに動くのですが、標準出力には入力させている文字列が表示されません。 具体的には、例えばprog.exeというプログラム内で、 printf("Input A =") ; gets(strA) ; printf("Input B =") ; gets(strB) ; となっていて、 入力用のテキストファイル(input.txt)に 1 2 と書込んで、 prog < input.txt とすると、 Input A =Input B= と表示されます。(strA,strBには各々1,2が入っています) テスト結果のログとしてできれば、人が入力する時と同様に Input A = 1 Input B = 2 と表示させたいのですが、何か方法がありますでしょうか? よろしくお願い致します。

専門家に質問してみよう