• 締切済み

sedの正規表現について

下記のsedコマンド正規表現の意味がわかりません どのような動きをしているのか教えて下さいm(__)m $ file_name="linux.txt" $ echo $file_name | sed -e "s/.*\.\([^.]*\)\$/\1/g" txt

みんなの回答

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

単に意味がわければいいだけなら「行末の『.』でない部分(≒ファイルの拡張子)だけを残す」です 他の言語やテキストエディタ等で、多少は正規表現について知っているのなら 「s→置換コマンド  検索文字列: .*\.\([^.]*\)$  置換文字列: \1  オプションg→行内の全て置換」 です。 ・正規表現が使われているのは .*\.\([^.]*\)$ \1 で、s/ / /g はsedの置換コマンド「s」と、その区切り文字、オプションです。 ・一部表現で、一般的な正規表現と\の扱いが逆になっています。 グループ化のための () は、sedでは\(\)と\が必要です。 括弧という文字そのものは、一般的に\(\)なのに対して、sedでは\不要の()です。 ・参照に使うのは、$1,$2...ではなく、\1,\2...です ・bashの文法として。 ダブルクオートで括ってあるので、一部文字は特殊な意味を持ちます。 $は変数展開に使います。その特殊な意味を無効にするために \$とエスケープします。 よって、実際には s/.*\.\([^.]*\)$/\1/g というのがsedのコマンドになります。 # 対応する表現が無いので、他の\.等はそのままになりますが、万全を期すなら # "s/.*\\.\\([^.]*\\)\$/\\1/g" と書くか、シングルクオートで 's/.*\.\([^.]*\)$/\1/g' とすべきところです。 今後、正規表現を使っていろんなことができるようになりたい、ということなら、ここでは書き切れないので、参考書等を見てください

関連するQ&A

  • cshのsed

    ヤマトです。 cshのsedについて質問します。 環境はRed Had Linux7.2です。 文字列置換でsedを使っています。 置換文字列に'/'が入ってしまう場合正常に動作しません。 原因は分かります。'/'が多いって事ですよね(曖昧な言い方ですみません) どのようにしたら、できるでしょうか? 以下に、サンプルを書きます。 ====SAMPLE.sh(一部抜粋)==== set DATA_DIR = /home/hoge set FILE_NAME = hoge.txt sed "s/__DIR__/$DATA_DIR/g" < FILE_NAME > FILE_NAME.sed ====hoge.txt==== 置換した ディレクトリは __DIR__/です ====hoge.txt.sed(作成したいファイル)==== 置換した ディレクトリは /home/hoge/です どのようにsedしたら良いのでしょうか? 教えて頂けると有り難く思います。宜しくお願いします。

  • 正規表現で悩んでいます。

    正規表現で悩んでいます。 Linuxを触っているのですが、例えば3番目の=と4番目の=の間の文字を取得するには どうしたらいいのでしょうか? 悩んでてらちがいかないので質問させていただきました。 $ echo "ewfja=iojoi=erewo=rjabc=123" | sed -e ""

  • 正規表現について(sed)

    いつもお世話になっております。 下記のようなURLから、特定のパラメータ以外はすべて除去したいのです。 http://XXX.jsp?rank=6&uid=aaaabfadfddfd&k=open&serial=12345&pr=ABC 残したいパラメータは k= a= pr= です。 s/[&?]\([k]\|[a]\|[pr]\\)=[0-9a-zA-Z%_-]\+//g この表現で、なんとか残したいパラメータを除去するのはできました。 「これ以外」という表現ができれば、望みの結果になると思うのですが、 いろいろ試してもうまくいきませんでした。 そもそも考え方が違うのかもしれないですが。。。 申し訳ありませんが、お詳しい方教えていただけると非常に助かります。 よろしくお願いいたします。 すみません、先ほどPHPでの処理でどうにかならないかと思い、 別の似たような質問を投稿してしまいました。 今回はLinuxのsedコマンドでの処理になるので、あえて別の投稿させていただいています。 申し訳ありません。。。 正規表現について(preg_replace) http://okwave.jp/qa/q7125468.html

  • sedを使ってHTMLファイルのタグを置き換えたいのですが、正規表現が

    sedを使ってHTMLファイルのタグを置き換えたいのですが、正規表現が上手く使いこなせなくて困っています。 実際のファイルには、<td class="style1" id="sequence1" >と書かれてある部分があり、これを<td>に置き換えたいのです。 それで、試しに sed -e 's/<td*>/<td>/g' ファイル名 と記述しましたが出来ませんでした。 正規表現の書き方が間違っているとは思うのですが、時間がなくお聞きすることにしました。 正しい書き方を教えて頂けますでしょうか。

  • sedコマンドに関して

    サーバーにあるファイルの中身を置換する為 Tera Termのsedコマンドを使おうとしたのですが 文字列の「'」が置換できません。 以下のように入力してみましたがだめでした。 sed -e 's/'/'aa/g' text1.txt > text2.txt sed -e 's/\'/\'aa/g' text1.txt > text2.txt 出来ないんでしょうか!? 宜しくお願いいたします。

  • sedの正規表現でグループ化する場合について

    1 echo "00012345" | sed -e "s/[0]*\(1234\)/\1/" と入れた時、想定したのは1234なのですが、 実際には12345と出力されます。 2 echo "00012345" | sed -e "s/[0]*\(1234\)5/\1/" と打つと1234になります。 グループ化してるので、1234だけが抽出されると思ったのですが、 なぜ1の時は5まで出力されるのでしょうか ちなみにgrepを使って検索すると echo "00012345" | egrep -o "(1234)" 1234と出て、グループ化でマッチングした物しか出ません

  • 正規表現の読み方

    /{(.+?)}/e この正規表現はどのような意味でしょうか? 下記のようなプログラム(テンプレートエンジン)に使われています display('index.html', $prm); function display($tpl, $prm) { $html = file_get_contents($tpl); $html = preg_replace('/{(.+?)}/e', '$prm[\'$1\']', $html); echo $html; }

    • ベストアンサー
    • PHP
  • シェルスクリプトの実行結果が毎回異なってしまいます

    お世話になります。 UNIX初心者です。 作成したシェルスクリプトを実行するたびに、結果が異なります。 正常に実行され、期待どおりの結果になる場合もありますが、 スクリプトの修正などをを全くしていないにも関わらず、ほぼ毎回異なる 結果になります。 ※変数に値が代入されなかったりして、文法エラーになったり、 エラーにならなくても結果が毎回違います。 以下に問題のスクリプトを記載しておりますが、内容を簡単に言いますと、 csvファイルの内容(ファイルサイズ、ファイル名の一部)を 読み取り、その内容を新しいファイルに書き出すというものです。 ※もちろんスクリプト実行時に読み込むcsvファイルは毎回同じものを使用しています。 初心者なので、何が悪いのか目処すらたちません。 ご教示頂ければ幸いです。 宜しくお願い致します。 【スクリプト内容】(長くなってしまいすいません) #!/bin/sh find /var/apache/htdocs/colo/test_batch2/ -name "RACK_*" > temp_file1 sed -e s/\\/var\\/apache\\/htdocs\\/colo\\/test_batch2\\///g temp_file1 |tee temp_file1 old_file_name=`cat temp_file1` sed -e s/csv/ar/ temp_file1 |tee temp_file1 file_name=`cat temp_file1` sed -e s/RACK_//g temp_file1 |tee temp_file1 sed -e s/.ar//g temp_file1 |tee temp_file1 file_cre_time=`cat temp_file1` wc -c $old_file_name |tee temp_file2 sed -e s/\\/var\\/apache\\/htdocs\\/colo\\/test_batch2\\///g temp_file2 |tee temp_file2 sed -e s/$old_file_name//g temp_file2 |tee temp_file2 file_size=`cat temp_file2` echo $file_name echo $file_size echo $file_cre_time touch $file_name echo '"'$file_cre_time'"' ',"'$file_size'"'|tee $file_name echo $file_name|tee temp_file3 sed -e s/ar/txt/g temp_file3 |tee temp_file3 txt_name=`cat temp_file3` touch $txt_name find /var/apache/htdocs/colo/test_batch2/ -name "AREA_*" > temp_file4 sed -e s/\\/var\\/apache\\/htdocs\\/colo\\/test_batch2\\///g temp_file4 |tee temp_file4 old_file_name=`cat temp_file4` sed -e s/csv/ar/ temp_file4 |tee temp_file4 file_name=`cat temp_file4` sed -e s/AREA_//g temp_file4 |tee temp_file4 sed -e s/.ar//g temp_file4 |tee temp_file4 file_cre_time=`cat temp_file4` wc -c $old_file_name |tee temp_file5 sed -e s/\\/var\\/apache\\/htdocs\\/colo\\/test_batch2\\///g temp_file5 |tee temp_file5 sed -e s/$old_file_name//g temp_file5 |tee temp_file5 file_size=`cat temp_file5` echo $file_name echo $file_size echo $file_cre_time touch $file_name echo '"'$file_cre_time'"' ',"'$file_size'"'|tee $file_name echo $file_name|tee temp_file6 sed -e s/ar/txt/g temp_file6 |tee temp_file6 txt_name=`cat temp_file6` touch $txt_name find /var/apache/htdocs/colo/test_batch2/ -name "BUIL_*" > temp_file7 sed -e s/\\/var\\/apache\\/htdocs\\/colo\\/test_batch2\\///g temp_file7 |tee temp_file7 old_file_name=`cat temp_file7` sed -e s/csv/ar/ temp_file7 |tee temp_file7 file_name=`cat temp_file7` sed -e s/BUIL_//g temp_file7 |tee temp_file7 sed -e s/.ar//g temp_file7 |tee temp_file7 file_cre_time=`cat temp_file7` wc -c $old_file_name |tee temp_file8 sed -e s/\\/var\\/apache\\/htdocs\\/colo\\/test_batch2\\///g temp_file8 |tee temp_file8 sed -e s/$old_file_name//g temp_file8 |tee temp_file8 file_size=`cat temp_file8` echo $file_name echo $file_size echo $file_cre_time touch $file_name echo '"'$file_cre_time'"' ',"'$file_size'"'|tee $file_name echo $file_name|tee temp_file9 sed -e s/ar/txt/g temp_file9 |tee temp_file9 txt_name=`cat temp_file9` touch $txt_name

  • 複数のファイルをsedで処理したいけど・・・

    こんにちは。sedでテキストファイルの文字の変換をしています。でも、 001.txt 002.txt 003.txt のように同じ変換をしたいファイルが延々とあります(涙) sed -e 's/a/b/g' 001.txt > 001convert.txt のように一つずつやっているととても大変です。 なのでワイルドカードが使えるかなと sed -e 's/a/b/g' *.txt > *convert.txt とやったら「*convert.txt」というのが一つだけできてしまいました。 変です・・・。 正しくはどのようにコマンドを書けばいいのですか? 教えてください!!

  • ["]でくくられた文字列内に存在する[,]をsedで処理する正規表現について

    PostgreSQLを使うのは初心者です。 csvファイルよりCOPYコマンドを使ってPostgreSQLのテーブルにデータを入れようとしています。 もとになるcsvファイルは、データの区切りは[,]であり、文字列は["]でくくられ、さらに["]でくくられた文字列には[,]が存在します。 <csvデータ例> 123,"aaa","b,cde",234 いろいろ調べてみた結果、COPYコマンドを実行する前に、sedコマンドで正規表現を用いて置換をすればよいとの結論にたどり着いたので、 (1)["]でくくられた文字列内の[,]を[#]に置換する  → [123,"aaa","b,cde",234] => [123,"aaa","b#cde",234] に置換したい (2)["]を除く(sed 's/\"//g')  → [123,"aaa","b#cde",234] => [123,aaa,b#cde,234] に置換したい (3)[,]をtabに置換する(sed 's/,/\t/g')  → [123,aaa,b#cde,234] => [123 aaa b#cde 234] に置換したい (4)[#]を[,]に置換する(sed 's/#/,/g')  → [123 aaa b#cde 234] => [123 aaa b,cde 234] に置換したい を順番に行う処理を考えていますが、(1)で記述する正規表現がわかりません。 正規表現も初めて扱う初心者ですので、色々試してみましたが、うまく置換できません。 どなたかご教授の程をお願いします。 なお環境は、RedHatLinux9 + PostgreSQL-7.4.9です。 以上、宜しくお願い申し上げます。