- PR -

シェルでファイルの特定行をコメント化する方法

1
投稿者投稿内容
MACHIKO
会議室デビュー日: 2008/04/02
投稿数: 14
投稿日時: 2008-04-04 18:24
こんにちは。お世話になります。

早速ですが、あるファイルの特定の値を持つ行をコメント化するという処理を
シェルファイルで作成したいのですが、文字列置換コマンド等で、一発で置換することは可能でしょうか?

具体的には
default abc
default def
default ghi


と記述のあるファイルのdefault defの行のみ先頭に#をつけてコメント化したいと思っています。


おそらくすごく初歩的なことではないかと思うのですが、方法がわからず・・・。
アドバイスいただければ幸いです。
どうぞよろしくお願い申し上げます。
F/A
ぬし
会議室デビュー日: 2006/03/18
投稿数: 312
お住まい・勤務地: Tokyo
投稿日時: 2008-04-04 20:37
単純には

sed 's/default def/#default def/g' ファイル名 ですよね。

Windowsに持っていってメモ帳で置換してもいいとは思いますが…

[ メッセージ編集済み 編集者: F/A 編集日時 2008-04-04 20:38 ]
MACHIKO
会議室デビュー日: 2008/04/02
投稿数: 14
投稿日時: 2008-04-04 21:32
ありがとうございます!!!

文字間(defaultとdefの間)のスペースが何バイトあるか確定できない場合は、
sed 's/default  *def/#default def/g' で合ってますでしょうか?

sedコマンドと正規表現で調べたところ
'*'は直前の文字を0回以上繰り返しということでしたので
スペースが最低1バイト以上の場合は' *'(スペース2バイト+*)という表現かと考えました。


[ メッセージ編集済み 編集者: MACHICO 編集日時 2008-04-04 21:33 ]
F/A
ぬし
会議室デビュー日: 2006/03/18
投稿数: 312
お住まい・勤務地: Tokyo
投稿日時: 2008-04-04 21:40
その場合は、
sed 's/\(default *def\)/#\1/g' ファイル名 でしょうか。

訂正

ご指摘のとおり * 部分は
sed 's/\(default  *def\)/#\1/g' ですね。
(スペース2つ)

[ メッセージ編集済み 編集者: F/A 編集日時 2008-04-04 23:00 ]
未記入
会議室デビュー日: 2008/03/28
投稿数: 3
投稿日時: 2008-04-04 23:55
引用:

MACHICOさんの書き込み (2008-04-04 21:32) より:
文字間(defaultとdefの間)のスペースが何バイトあるか確定できない場合は、
sed 's/default  *def/#default def/g' で合ってますでしょうか?


よく見ると全角スペースが入ってますが。何バイトとはどういうことだろう。
・全角か半角のスペースが1つ
・全角か半角のスペースが1つ以上
・半角スペースが1つ以上
とかで違うよ。

とりあえずいろいろためして見るのが一番ではないでしょうか。

アドレスを使った、それっぽい例。
sed '/^default[  ][  ]*def/s/^/#/'

共通テーマ: 実例でわかるsed
http://www.ibm.com/developerworks/jp/linux/library/l-sed1/
http://www.ibm.com/developerworks/jp/linux/library/l-sed2/
http://www.ibm.com/developerworks/jp/linux/library/l-sed3/
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2008-04-05 11:19
「あるファイルの〜をコメント化」ですよね。
であれば、置換してなおかつオリジナルのファイルを書き換える、ってことで

 $ perl -pi -e '/^default\s+def$/ and print "#"' ファイル名

かと思いました。
sed だと、置換後のデータを作るだけなので、それを一時ファイルに保存してからオリジナルを書き換える手間がかかりますよね。

※sed の時と同じように、
  $ perl -pi -e 's/^default\s+def$/#$&/' ファイル名
 や、
  $ perl -pi -e 's/^(default\s+def)$/#$1/' ファイル名
 でも良いです
※/^default\s+def$/ の $ を付けない場合、“default defXXXX”のような行もコメント化されますが、それはよろしいのでしょうか?

[ メッセージ編集済み 編集者: angel 編集日時 2008-04-05 11:29 ]
MACHIKO
会議室デビュー日: 2008/04/02
投稿数: 14
投稿日時: 2008-04-06 03:10
F/Aさん、未記入さん、angelさん
アドバイス本当にありがとうございました。

最終的に
perl -pi -e 's/^(default\\s+def)$/#$1/' ファイル名
で置換処理を行うことにしました。


全角スペースが混在していた点は、私の入力ミスです。
正しいアドバイスを求めるには注意不足でした。以後気をつけるようにします。
ご指摘ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)