• ベストアンサー
  • 困ってます

sedで編集対象ファイルのコメント行を無視する

sedで、いわゆるUNIXにありがちなconfファイルを編集しようとしています。 例えば、以下のようなtest.confファイルがあります。 # cat test.conf #### # test.conf file #### # parameter = xxx   parameter = aaa # set here   #parameter = bbb # set here このファイルの parameter を zzz に変更する場合に、 # sed "s/parameter =.*/parameter = zzz/" < test.conf > test.conf.new と実行すると、コメント行も含めて全て「parameter = zzz」と置き換わります。 そもそもコメントなので動作上問題はないのですが、confファイルのコメント行は sedで無視するようにするには、どのようにしたら良いでしょうか。 ちなみにコメントをあらわす"#"は、行の先頭や、空白、タブの後にあります。 また、正しいパラメータのうしろに説明としてコメントが入る場合もあります。 できればこの空白やタブ、コメントを前処理で削除などせず、見た目は同じまま、 コメントでない行のパラメータだけを入れ替えたいのです。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数384
  • ありがとう数1

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

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

「文字列中に # が現れない」と言う制限をつけていいなら s/^\([^#]*\)parameter =[^#]*/\1parameter = zzz/ でいいような気がする.

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 試したところバッチリでした。 教えていただいたコマンドの意味は勉強します。 ありがとうございました。

関連するQ&A

  • sedを使って複数ファイルの先頭行を表示

    以下の様なファイルがあります。 各ファイルの先頭行をとりだしたいのですが、headコマンドを使うと ファイル名と結果が分かれて表示されます。 sedで、-nオプションの行番号指定で表示することができるので、 sed -n '1p' *.txt のワイルドカード指定でやったのですが、 この場合だと複数ファイルとみてくれなくて、すべてのファイルを ひとつにしてその先頭を表示しているみたいです。 できれば、各ファイル毎に、ファイル名と結果を1行にして表示したい のですが、どうすればよいでしょうか。 参照ファイル cat 1.txt 12345 67890 cat 2.txt abcde fghij cat 3.txt 11111 22222 headコマンドで実行 $ head -n 1 *.txt ==> 1.txt <== 12345 ==> 2.txt <== abcde ==> 3.txt <== 11111 sedで実行 $ sed -n '1p' *.txt 12345

  • sed の結果が異なる

    sedを使って先頭が'-'の行を消したいのですが、以下の始めのファイルtestでは消せるのですが、books.xmlの方では消せないので困っています。 よろしくお願いします。 $ cat test aaa - -aaa - b-b bb- $ sed '/^-.*/d' test aaa b-b bb- $ cat books.xml <book isbn="1-2345-6789-0"> <title>The book A0</title> <author>Mr.A0</author> </book> - <book isbn="1-2345-6789-1"> <title>The book A1</title> <author>Mr.A1</author> </book> - <book isbn="1-2345-6789-2"> <title>The book A2</title> <author>Mr.A2</author> </book> - $ sed '/^-.*/d' books.xml <book isbn="1-2345-6789-0"> <title>The book A0</title> <author>Mr.A0</author> </book> - <book isbn="1-2345-6789-1"> <title>The book A1</title> <author>Mr.A1</author> </book> - <book isbn="1-2345-6789-2"> <title>The book A2</title> <author>Mr.A2</author> </book> -

  • unix sedコマンドについて

    file --------------------------------------- abcdefghijklmnopqrstu abcdefghijklmnopqrstu person=aaa wake walk work abcdefghijklmnopqrstu abcdefghijklmnopqrstu --------------------------------- といったファイルにて このファイルからperson~空白行を「sedコマンド」で削除したいのですがどのようにしたらよいでしょうか。 sedコマンドを使用すると、どうやら、数行あるテキストを一行にまとめ、空白行を見つけたらその行を削除するといった動きになるようです。(一行でそれを行うのでしょうか。。) どなたか、わかる方いたら教えていただけないでしょうか。 よろしくお願いします。

  • sedコマンドによる最終行の削除について

    sedコマンドを使用してファイルの最終行を削除する方法を調べていたのですが 最終行の削除は問題なくできたのですが最終行から特定行までを消すため以下のコマンドを発行したのですがうまくいきませんでした。複数サイトを見てみたんですが構文自体は同じでしたのでおそらく問題ないとは思うですが何か気づく方がいたらお教えください。 以下実行コマンド sed -e '$-3,$d' sed_test.txt

  • 複数パターンのsed文についての質問です。

    sedの使い方がよく分からない為、教えてください。 テキストの中で、同じパターンスペースに対して、 別の文字を置換させたいと考えています。 (一つ目のマッチングには、yyy 二つ目には、zzzなど) sed文ではコマンドブロックの書き方がわからないので、 sedスクリプトを別に用意してファイルを読み込ませた所、 うまくいきました。 sed -f test.sed test.txt しかし、第二段階として、置換文字列を変数にしたところ、 変数展開ができませんでした。実際には変数展開を考えているので、 困っているところです。 この問題を解決できるようなsed文(sed -e)か、sedスクリプトを 教えて頂きたく宜しくお願いいたします。 下記、テスト材料です。 一つ目のabcを $HOMEに、 二つ目のabcを $SHELLに置き換えたいです。 text.txt (編集元テキスト) ------------------ User yyyyy abc Pass zzzzz abc ------------------- test.sed(SEDスクリプト) --------------------- /User/{ N N s/abc/$HOME/ N N N s/abc/$SHELL/ } ----------------------

  • コメントの開始位置をそろえるには

    今VisualStudio2008でソース修正を行っているのですが、 code1();_______// test if( a == 0 ) { ____b = 1;___________// test ____c = 2;____// test } 上記を下記のように code1();______________________// test if( a == 0 ) { ____b = 1;_____________________// test ____c = 2;_____________________// test } 手軽に指定した位置にコメントを揃えられるようなツールはないでしょうか?(入力欄の都合でアンダーバーを空白と見立てています) 自分で作ろうとしたのですが、ソースファイルを文字列として読み込むと、インデントの幅はスペース4つ分でも2つ分でもすべて「\t」として読み取るので実際の幅が得られず、躓きました。そもそもファイルを閲覧するソフトウェアによってタブの移動量って変わりますね・・・。 ちなみに上記コードは「if(」の直後や、変数bとcの直後にもタブが入っている可能性があるとお考えください。

  • UNIXでファイルの中身を更新

    いつもお世話になっております。UNIXを使用しております。 とあるAAA.confという名のファイル内の任意の行「TEST=-200」を 「TEST=-250」というように更新したいのですが、下記(1)、(2)の 方法でできますでしょうか。どのようなコマンドを使用するとよい ですか。 (1)更新したい行をピンポイントで上書き更新。 (2)更新したい行の直前までの内容を別ファイルAAA_TOP.confとし、 直後の内容を別ファイルAAA_BOT.confとして作成しておき、更新 処理を行う際に、 (2)-1:AAA_TOP.confを読み込み、新規のAAA.confに書き込む。 (2)-2:「TEST=-250」と書き込む (2)-3:AAA_BOT.confを読み込み、新規のAAA.confに追記する。

  • sedで特定文字が出たら次の行は読み飛ばす

    Linuxのsedコマンドなのですが、特定文字列が出たら読み飛ばすという事をやっています。 例えば、'#SKIP'が出たら次の行(複数行)は読み飛ばすみたいな事をです。 行飛ばしで2点質問がありますのでお願いします。 以下の様なファイルがあります。 /---------- $ cat input.txt YYYY YYYY YYYY YYYY YYYY #SKIP YYYY YYYY YYYY YYYY YYYY -----------/ '#SKIP'が出たら次の行を読み飛ばすは、 $ sed '/#SKIP/{N; s/YYYY/2016/g}' input.txt YYYY YYYY YYYY YYYY YYYY #SKIP 2016 YYYY YYYY YYYY YYYY と、'#SKIP'の下の行が置換されます。 数行読み飛ばす場合は $ sed '/#SKIP/{N;N;N; s/YYYY/2016/g}' input.txt YYYY YYYY YYYY YYYY YYYY #SKIP 2016 2016 2016 YYYY YYYY と、'#SKIP'から下の3行が置換されます。 てっきり、'#SKIP'から指定した(N;)行分読み飛ばし、それ以降を置換すると 思っていたのですが違うのでしょうか。 使い方が間違っているのでしょうか。 また、同じ様な行飛ばしで、範囲指定した場合ですが、 $ sed -e '3,20n;n;n; s/YYYY/2016/g' input.txt や $ sed -e '3,20{n;n;n; s/YYYY/2016/g}' input.txt とした場合、範囲指定外の3&#65374;20以外でも置換されます。 3行目から置換されたり、20行目を越えても置換されます。 OS、バージョンによるものでしょか。 本記載の2点について教えて下さい。

  • bashでの複数行のコマンドのリダイレクト

    Linux上のbashを使用して、複数行のコマンドの結果を一度にリダイレクトしたいと思います。 思いついた方法が、 #!/bin/bash cat << EOF >> ./test.log cat /etc/fstab cat /etc/inittab cat /etc/modprobe.conf EOF といった方法なのですが、これですとそれぞれのコマンドの結果ではなく、 単に cat /etc/fstab cat /etc/inittab cat /etc/modprobe.conf と言った出力結果がtest.logに出力されてしまいます。 上記のような複数のコマンドの結果を一度にリダイレクトする方法は無いでしょうか? cat /etc/fstab >> ./test.log cat /etc/inittab >> ./test.log cat /etc/modprobe.conf >> ./test.log と言った方法は避けたいと思います(実際には何10行と言うコマンド結果を出力したいので)

  • 【sed】変数に設定したコマンドの実行について

    お世話になります。 一度変数に文字列として格納したsedコマンドの実行についての質問です。 以下、「実装1」のように、「あるファイルの最終行を除外して別のファイルに書き込む」という処理を行おうとしています。 ログ出力などの関係で、実行するコマンドを一度変数に格納する必要があるのですが 一度変数に格納して実行すると「実装2」のようにエラーが出てしまいます。 変数に格納したsedコマンドを実行するにはどのようにすればいいでしょうか? なお、シェルはbashです。 実行例ではターミナルから直接実行していますが、実際にはシェルスクリプトにして実行します。 以上、どなたかご教示頂けないでしょうか。 ■実装1 [root@localhost tmp]# cat /tmp/data aaa bbb ccc [root@localhost tmp]# sed -e '$d' /tmp/data >/tmp/data2 [root@localhost tmp]# cat /tmp/data2 aaa bbb [root@localhost tmp]# ■実装2 [root@localhost tmp]# CMD='sed -e $d /tmp/data >/tmp/data2' [root@localhost tmp]# echo $CMD sed -e $d /tmp/data >/tmp/data2 [root@localhost tmp]# $CMD aaa bbb sed: >/tmp/data2を読み込めません: そのようなファイルやディレクトリはありません [root@localhost tmp]#