sedで編集対象ファイルのコメント行を無視する方法について

このQ&Aのポイント
  • sedコマンドを使用してconfファイルを編集する際に、コメント行を無視する方法を知りたいです。
  • sedコマンドでconfファイルのパラメータを変更する際、コメント行を除外する方法について教えてください。
  • confファイルをsedで編集する際、コメント行をスキップする方法を教えてください。
回答を見る
  • ベストアンサー

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で無視するようにするには、どのようにしたら良いでしょうか。 ちなみにコメントをあらわす"#"は、行の先頭や、空白、タブの後にあります。 また、正しいパラメータのうしろに説明としてコメントが入る場合もあります。 できればこの空白やタブ、コメントを前処理で削除などせず、見た目は同じまま、 コメントでない行のパラメータだけを入れ替えたいのです。 よろしくお願いします。

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

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

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

windfactA
質問者

お礼

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

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

  • pythonでファイルのコメント行を削除したい

    pythonを勉強し始めたばかりなのですが、ちょっと困っています。 pythonでデータファイルのコメント行を削除して、データだけ後の計算に回したいのですが、コメント行を削除する方法がわからなくて困っています。 データファイルは以下のようになっています。 #test1 #test2 test2 #test3 teset3 test3 0, 10 1, 2 2, 9 3, 3 4, 4 5, 7 コメント行は頭に#が付くようになっていますが、この例のように3行ではなく、他の行数になった場合でも対処できるようにしたいです。

  • 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~20以外でも置換されます。 3行目から置換されたり、20行目を越えても置換されます。 OS、バージョンによるものでしょか。 本記載の2点について教えて下さい。

  • ファイルから特定の行を出力したい

    あるファイルの特定の一行だけを取りだすunixの コマンドを教えて下さい。 具体的には cat a.txt 1gyoume 3gyoume 4gyoume 5gyoume 6gyoume 7gyoume 8gyoume といったファイルの末尾からX行目の内容を変数に入れたいのです。 a.txtが8行あると判断して8-X行目でファイルを分割、そのファイル をtailコマンドで末尾1行目だけ出力すると出来そうだと思ってい るのですがもっと簡単な方法はないでしょうか。

  • コメント行を検索対象から除外する方法

    C/C++のソースコードを普通にテキスト検索やGREPを実行すると、当然コメントも検索結果に表示されます。コメント部分が検索結果に表示されないようにする手段やツールはあるでしょうか?つまり、"//"以降改行文字までと"/* */"に囲まれたコードを検索対象から除外するということです。#if 0 ~ #endifも適切に解釈して除外してくれるとより助かります。 Visual Studioのテキストエディタで実現出来れば一番都合が良いのですが、それらしいオプションが見当たりません。 秀丸エディタのGREPのオプションに「追加の条件」の設定があり、ここでコメントを除く指定をすればコメント行が検索対象から除外されます。ただ、この方法だと通常の検索の何倍もの時間がかかってしまい非現実的です。恐らく全ての文字をコメント文字かどうか判定しているのでしょう。 検索対象のソースは2万ファイルに上り、100万行を超えています。10文字の検索文字列で、普通に全ソースGREPすると25秒程度、コメントを除くオプション指定だと315秒(5分以上)かかりました。もちろん検索文字の長さやその他オプションにも依存するでしょうが、さすがに普段使いとしては現実的ではない所要時間です。 除外したいコメント行はたいてい行頭にコメント文字"//"がありますので、行頭の"//"のチェックに限定したいです。ただ空白スキップくらいはあると良いです。これにより現実的な検索時間に収まるかどうかはやってみないと分かりませんが・・ なお、検索結果からコメント行を削除する秀丸のマクロはありました。ただ、この方法ではコメント行も検索対象となるため、余分な検索時間がかかっていますし、何しろ二度手間です。普段のソース検索でコメント行も含む検索はあまり行わないと思います。 なぜこれが問題になるかと言いますと、ソースに修正前のコードをコメントとして残してあるため、コメント行が膨大になっているのです。Javaの標準ライブラリほどではありませんが、ざっと調べたところソースの40%はコメント行です。 同一箇所の複数の変更履歴が全部コメントとして残っているため、実質1か所のヒットでも検索結果に2つも3つも重複して表示されてしまいます。もちろん、このように修正履歴をコメントとして残すこと自体が問題なのは分かっていますが、自前のソースではないので手を出せないのです。

  • 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に追記する。

  • UNIXのcshについて。

    ちょっとここに質問していいものか迷いましたが、 このカテゴリで質問させていただきます。 UNIXのCシェルで、あるシェル変数に1行分のデータが 読み込まれていて、これをいくつかのデータがタブ 区切りで入っています。 これを違う複数の変数に各データを切り分けて入れた いのですが、どうしたらいいかわかりません。 awkやsedという手を考えたのですが、あれはファイルから 読み込むので、できませんでした。 わかる方がいらっしゃればよろしくお願いします。

  • 多数あるファイル(text base)の*行目だけを引っ張ってきて標準出力させたい。

    Unix初心者です。 SunOS > head -1 ./*.txt とすれば、以下のように1行目だけを引っ張ってきて標準出力させる事も可能ですが。 ==> 1234.txt <== hello ==> 1235.txt <== hello SunOS > head -2 ./*.txt とすると、1行目と2行目が標準出力されます。 ==> 1234.txt <== hello bye ==> 1235.txt <== hello bye ですが、以下に例をあげますが、このように " 2行目だけ " を標準出力させたいのです。 ==> 1234.txt <== bye ==> 1235.txt <== bye sed -n '2p' ./*.txt だと、理由は不明ですが一つのファイルしか標準出力されませんでした。 head 、sed でなくともawk grepでも構いません。 その他の自分の知らないコマンドで構いません。 文字検索ではなく、*行目と行数指定です。 できれば、ファイル名も同時に出力させたいのです。 欲を言えば、行数も出力させたいです。 更に、翌を言えば、指定行を増やせたら最高です。 例;)1行目と3行目を標準出力する。 scriptを作りこまずに、|(パイプ)でつなげれば一行のコマンドで処理可能なのでは ないかと想像してますが、いかがでしょうか。 宜しく頼みます。

  • 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行と言うコマンド結果を出力したいので)

専門家に質問してみよう