2

次のように、UNIXにfile1.txtがあります

[Section A]
$param1=value1
$param2=value2

[Section B]
$param1=value1
$param2=value2
$param3=value3

プログラムでセクション B の value2 をnew_value2に編集したい

[Section A]
$param1=value1
$param2=value2

[Section B]
$param1=value1
$param2=new_value2
$param3=value3

これを行うためのUNIXコマンドは何ですか(sedを使用しますか?)?

どうもありがとう。

4

5 に答える 5

3
sed -ie '/^\[Section B\]$/,/^$/s/^\$param2=value2$/$param2=new_value/' foo.txt

編集:上記の例は、古い値とスペース文字に関して非常に厳密です。おそらくより適切な別の例を追加します。sed スクリプトは 1 つのコマンドで構成され、次のアドレス範囲が先頭に付きます。

/^\[Section B\]/,/^\[.*\]/

アドレス範囲は、コンマで区切られた 2 つの正規表現で構成され、次のコマンドを最初のアドレスが一致する行から開始し、2 番目のアドレスが一致するまで (包括的に) 継続する行に制限します。

s/^\(\$param2[ \t]*=[ \t]*\).*$/\1new_value/

置換コマンドは、範囲で実際の置換を行います。すべて一緒に:

sed -ie '/^\[Section B\]/,/^\[.*\]/s/^\(\$param2[ \t]*=[ \t]*\).*$/\1new_value/' foo.txt
于 2012-04-06T07:11:40.933 に答える
0

本当に簡単な解決策。

ex file1.txt <<"INPUT"
/Section B
/param2
s/value2/new_value2/
:x
INPUT
于 2012-04-08T10:55:40.577 に答える
0

ファイルを解析し、編集を実行し、再構成するTXRプログラム:

@;
@; grab four comand line arguments
@;
@(next :args)
@(cases)
@file
@new_section
@new_param
@new_value
@(or)
@(throw "arguments needed: file section param value")
@(end)
@;
@; hash table mapping sections to assocation lists of values
@;
@(bind sec @(hash :equal-based))
@;
@; parse file, obtaining list of section names and filling in
@; section hash with an associ list of entries.
@;
@(next file)
@(collect)
[Section @secname]
@  (collect)
$@param=@val
@  (until)

@  (end)
@(do (set [sec secname] [mapcar cons param val]))
@(end)
@;
@; now edit
@;
@(do (let ((sec-entries [sec new_section]))
       (if (null sec-entries)
         (push new_section secname))
       (set [sec new_section] (acons-new new_param new_value sec-entries))))
@;
@; now regurgitate file
@;
@(do (each* ((s secname)
             (ent (mapcar (op sec) s)))
       (format t "[Section ~a]\n" s)
       (each ((e ent))
         (format t "$~a=~a\n" (car e) (cdr e)))
       (put-string "\n")))

テスト実行:

# edit section B param2 to new_value2

$ txr config.txr config.txt B param2 new_value2
[Section A]
$param1=value1
$param2=value2

[Section B]
$param1=value1
$param2=new_value2
$param3=value3

# add new parameter x with value y to section A

$ txr config.txr config.txt A x y
[Section A]
$x=y
$param1=value1
$param2=value2

[Section B]
$param1=value1
$param2=value2
$param3=value3

# add new section with new parameter

$ txr config.txr config.txt foo bar xyzzy
[Section foo]
$bar=xyzzy

[Section A]
$param1=value1
$param2=value2

[Section B]
$param1=value1
$param2=value2
$param3=value3

読者のための演習:パラメータと値のペアの削除を実装します。

于 2012-04-06T18:01:01.853 に答える
0

Perl で問題ない場合は、次の操作を実行できます。

perl -pe '$f=1 if(/\[Section B\]/);
          s/^\$param2=value2$/\$param2=new_value2/ if($f);' < file

見る

于 2012-04-06T07:11:47.977 に答える
-1

awk で解決策が必要な場合:

nawk -F= '{if($0~/Section B/){print;getline;print;getline;gsub(/value2/,"value9",$2);print}else print}' file3

以下でテスト済み:

pearl.274> cat file3
[section A]
$param1=value1
$param2=value2

[Section B]
$param1=value1
$param2=value2
$param3=value3
pearl.275> nawk -F= '{if($0~/Section B/){print;getline;print;getline;gsub(/value2/,"new_value2",$2);print}else print}' file3
[section A]
$param1=value1
$param2=value2

[Section B]
$param1=value1
$param2 new_value2 
$param3=value3
pearl.276> 
于 2012-04-06T07:19:08.290 に答える