私は1行だけを変更するために、複数のパラメータセクションを含む100を超えるファイルを読み取るシェルスクリプトを作成しようとしています。ファイルのセクションが含まれていない場合は、そのセクションのELLIPSOID_CODE = 123
前ELLIPSOID_CODE = DEFAULT
に行を追加してくださいOUTPUT_PARAMETER
。ファイルのセクションにそのエントリが含まれている場合は、何もしないでELLIPSOID CODE = 123
ください。動作するようにシェルスクリプトを解析する際に問題があります。以下にサンプルファイルと試したコードがあります。
----------------------------------------------------------------------- ------
NUM_RUNS = 2
INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
ELLIPSOID_CODE = 123
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest
INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest
-------------------------------------------------------------------------------
#Adds in the line "ELLIPSOID_CODE = DEFAULT" before OUTPUT_PARAMETER
dir="/home/autotest/test/"
for i in "$dir"/*;
do
sed -i 's:OUTPUT_PARAMETER:ELLIPSOID_CODE = DEFAULT\nOUTPUT_PARAMETER:' "$i";
done
私のコードはELLIPSOID_CODE = DEFAULT
とにかくすべてのセクションにその行を追加しますが、このファイルの2番目のセクションにのみその行を追加したいと思います。明確にするために、次のように見えるように努めています。
-----------------------------------------------------------------------------
NUM_RUNS = 2
INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
ELLIPSOID_CODE = 123
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest
INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
ELLIPSOID_CODE = DEFAULT
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest
-------------------------------------------------------------------------------
ベストアンサー1
sed
解決策:
sed -i '/^OUTPUT_PROJECTION_TYPE = .*/{
N; s/OUTPUT_PARAMETER = .*/ELLIPSOID_CODE = DEFAULT\n&/;
}' /home/autotest/test/*
/^OUTPUT_PROJECTION_TYPE = .*/
- パターンで始まる各行の場合OUTPUT_PROJECTION_TYPE = .*
(ここで^
正規表現アンカーは文字列/行の始まりを表します):N
- パターンスペースに改行文字を追加した後、パターンスペースに次の入力行を追加します。s/OUTPUT_PARAMETER = .*/ELLIPSOID_CODE = DEFAULT\n&/
- 次の行が欠落している場合OUTPUT_PARAMETER = .*
(欠落していることを意味ELLIPSOID_CODE = ...
) - 基本行の前に追加しますELLIPSOID_CODE = DEFAULT
。 (&
一致する文字列全体を指す)