• 締切済み

viでの置換

if($b =~ /(?=A?B{1,2})/){  print "b\n"; } この文章中で?=の=だけ!に置換したいのですが :%s/?=\&=/!/g だとE486: パターンはみつかりませんでした: ?=\&=と表示されました. ですが, :%s/=A\&=/!/g だとうまくいきました.?がエスケープされてないから(素人目線ですが)と思い :%s/\?=\&=/!/g とすると E64:\? の後になにもありません E476: 無効なコマンドです 続けるにはENTERを押すかコマンドを入力してください となりました.なぜ:%s/?=\&=/!/gではダメなのでしょうか?

みんなの回答

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.1

> ?=の=だけ!に置換したい のであれば、 :%s/?=/?!/g ではダメなんですか?

garusu
質問者

補足

あ,なるほどw それもありますね △に含まれる□にマッチさせるというのを今日知ったので, 使ってみたかったんですw

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 置換文字列の中に"?"があると置換できません。

    恐れ入ります。 ?”クエスチョンマーク”の置換をしたいのですが できなくて困っています。 例 #!/usr/bin/perl $a='a?a'; $b='bbba?abbbbaaaabbbbabbbbb'; $b=~ s/$a//g; print "$b\n"; 文字列$bから”a?a”を削除しようとしているのですが、 変化しません。 ためしに\?としてみましたが・・・だめでした。 ?を!に変えたい!とかいう人は絶対いると思い 「クエスチョンマーク 置換」 等で検索したのですが、 「0個(=1個もない)、または1個ある場合」を表している」 等の情報ばかりでした・・・ どうか教えてください。。。

    • ベストアンサー
    • Perl
  • # の置換はどうすればいいですか?

    #をAに置換する場合 s/#/A/; というふうに考えますが、コメントアウトされてしまいます。 /を置換するときは\/でエスケープできるのですが、#の場合どうすればよいのでしょう? また、////という文字列をAに置換する場合、 s/\/\/\/\//A/; というふうに書かなければならないのでしょうか? 何かうまい方法はありますか?

    • ベストアンサー
    • Perl
  • この置換処理について

    以下の処理がうまくいきません。 perlで実行すると以下の置換を行ってテキストファイルができるはずなのですが、0KBのテキストファイルができてしまいます。 そこで、手動で置き換えようと思ったのですが。 正規表現を使用した、置換処理を行っているということはわかっているのですが中の処理が分かりません。 詳しい処理の内容を教えていただけないでしょうか。 よろしくお願いいたします。 while(<>){ if(m#^(.+) /// (.+)$#){ $flg = 1; $word = $1; $text = $2; $line = $_; if($word =~ / /){ #熟語なら if(length($word) > 15){ $flg = 0; } elsif($word =~ /([A-Za-z]+) ([A-Za-z]+)/){ if(length($1) > 5 && length($2) > 5){ $flg = 0; } } } if($text =~ m#/#){ $text =~ s#/ .+##g; } } if($flg){ print $word.' /// '.$text."\n"; } }

    • ベストアンサー
    • Perl
  • パイプ以外をエスケープしてマッチ判定させる方法

    |(パイプ)以外をエスケープしてマッチしているか判定をさせたいのですが、スマートな方法をご教授して頂けないでしょうか? 下記は、自分で作ってみたものですが、イマイチなので・・・ それと「?」「*」「+」「|」以外でも\Qでエスケープされない文字ってあるのでしょうか? #!/usr/bin/perl print "Content-type: text/html\n\n"; print<<"end"; <HTML><BODY> end $a = "http://www.excite.co.jp/index.html?12"; $b = "index.html?12"; $c = $a; $c =~ s/\?/<-hatena->/g; $c =~ s/\*/<-asuta->/g; $c =~ s/\+/<-plus->/g; $d=$b; $d =~ s/\?/<-hatena->/g; $d =~ s/\*/<-asuta->/g; $d =~ s/\+/<-plus->/g; if($c=~ m/$d/i){$match_j="ok";} print<<"end"; a: $a<br> b: $b<br> c: $c<br> d: $d <br>($c=~ /\Q$d\E/i) <br>match:$match_j </BODY></HTML> end

    • ベストアンサー
    • Perl
  • 正規表現の置換演算子に変数を埋め込むことをしたいのですが

    正規表現の置換演算子に変数を埋め込むことをしたいのですが $a = 'abcd0001'; $b = '0005'; $a =~ s/abcd([0-9]{4})/abcd\$b/; #=> $a=[abcd$b] print "\$a=[$a]\n"; とすると、abcd$bとなります。 置換演算子1行で、abcd0005とする方法はあるのでしょうか?

    • ベストアンサー
    • Perl
  • 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のコマンドで置換するときに、sed コマンドを使うと思います。 今、プログラムのソースコードの中に含まれている語句を取得するために、色々いじろうと思っています。 私が最もお聞きしたいのは、正規表現の書き方であることを、まずご理解ください。 ソースコードの中に、 string headline="語句1,語句2,・・・,語句n-1,語句n"; というように、 string headline= で始まっていて、 その後に " "(ダブルクォーテーションの組)で囲まれた部分が1箇所あり、 その部分に、カンマ(,)で区切られた語句がいくつもあるような行があったとき、 その " "の部分を、 "語句1", "語句2", ・・・ "語句n-1", "語句n" のように置換したいのです。 つまり、語句一つ一つをダブルクォーテーションで包んで、1行に語句が1つになるようにしたいのです。 厳密に言えば、stringとheadlineの間などに、タブや空白がいくつあるかわからないという問題なども考える必要があるかもしれません。 とりあえず私が考えたのは、 s/\(string headline="\)\([^,]\)+,\(";\)/\1\2",改行"\3/g です。 s/置換前の文字列のパターン/置換後の文字列のパターン/g となっています。 置換前のパターンで \( \) で囲まれている部分は、置換後のほうで、\1のように参照できます。 ■■でも、私の書いたものって、語句が繰り返し出現することに対応できていないように思われます。■■ 実際に、置換に改行を含めるには、正規表現をファイルの中に書いて、sedの-fオプションで読み込ませることになると思います。 string headline=" " という形をしていないものは、たとえ、" " の中がカンマで区切られていてもそれを分けません。

  • 入力したテキストを置換するプログラミングを作りたいのですが上手くいかず

    入力したテキストを置換するプログラミングを作りたいのですが上手くいかず困っています。 テキストエリアに文章を入力し、 次に置換前の文字と置換後の文字をそれぞれ入力する形にして置換をしようと考えています。 最終的に置換前の文字と置換後の文字を入力する欄を複数用意して 複数の置換を一度で行ないたいと思っています。 ですが下記の「a1」に入力した置換前の文字全て削除され「a2」の内容に変換されません。 初心者なので根本的に間違ってるかもしれませんが、わかる方よければ教えてください。 ----------------- <form method="post" action="form.cgi"> <textarea name="chikan" rows="10" cols="70"></textarea><br> <input type="text" name="a1" size="50">を<input type="text" name="a2" size="50">に変換<br><br> </p> <p><input type="submit" value="置換"></p> </form> ----------------- ----------------- #!/usr/local/bin/perl if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'}); } else { $alldata = $ENV{'QUERY_STRING'}; } foreach $data (split(/&/, $alldata)) { ($key, $value) = split(/=/, $data); $value =~ s/\+/ /g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg; $value =~ s/\t//g; $value =~ s/\n//; $in{"$key"} = $value; $in{'chikan'} =~ s/\Q$in{'a1'}\E/$in{'a2'}/g; } print"Content-type: text/html\n\n"; print <<"EOM"; <html> <head><title></title> </head> <body> <textarea name=area rows=50 cols=70> $in{'chikan'} </textarea> </form> </body> </html> EOM exit; -------------------------

    • ベストアンサー
    • CGI
  • 偶置換、奇置換

    群について勉強していて、わからないことがあります。 nを自然数として、X_n={1,2,…,n}、 S_n={σ:X_n→X_n|σは全単射} とおく。 A_nを偶置換全体からなるS_nの部分群とする。ρ∊S_nは奇置換であるとし、 ρA_n={ρσ∊S_n|σ∊S_n} とおく。 この時、「φ(σ)=ρσ(σ∊A_n)で定まる写像φ:A_n→ρA_nが全単射である。」 とあるのですが、ここの部分がよくわかりません。 単射であることは以下のように証明してみました。 「σ、σ’∊A_nとして、ρσ=ρσ’ならば、両辺にρ^(-1)を左から作用させるとσ=σ’」 全射についてうまく証明することができません。 どのようにすればよいのか教えていただけると助かります。

  • ”ァー”が含まれている文字を置換すると文字化け

    OS:solaris8 perlのver:5.8.6 perlで、”ァー”が含まれている文字列に対し、 全角スペースを半角スペースに置換しようとすると 文字化けしてしまいます。 (”ぁー”でもどうようでした) ”ぃー”や”ぅー”、”ぁ”では 問題無いのですが…。 当方、perl初心者&文字コードに詳しくないため、 原因がよくわからないでいます。 どなたか原因をおわかりの方、 ご教授お願いいたします。 文字コードはEUCです。 以下はソースです my $line = "ファイヴァー スコープ 眼鏡"; $line =~ s/\t/ /g; # タブを半角スペースに置換する print '$line2='.$line."<br>\n"; $line =~ s/ / /g; # 全角スペースを半角スペースに置換する print '$line3='.$line."<br>\n"; #↑ここで文字化けしてしまいます $line =~ s/^\s+//; # 頭の空白を除く print '$line4='.$line."<br>\n"; $line =~ s/\s+$//; # 尻の空白を除く print '$line5='.$line."<br>\n";

    • ベストアンサー
    • Perl