Shell脚本解析多个文件并在满足条件时添加一行?

时间:2018-01-11 17:54:07

标签: shell unix sed scripting

我尝试编写一个shell脚本,读取每个文件中包含多个参数部分的一百多个文件,只修改一行。如果一个文件中的某个部分不包含" ELLIPSOID_CODE = 123",请在行中添加" ELLIPSOID_CODE = DEFAULT"之前" OUTPUT_PARAMETER"。如果一个文件中的某个部分确实包含" ELLIPSOID CODE = 123",则不要做任何事情。我在shell脚本中解析时无法正常工作。我有一个文件示例和我在下面尝试的代码。

-----------------------------------------------------------------------------
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,当我只想让它在这个文件的第二部分中添加该行时。只是为了澄清我试图让它看起来像这样:

-----------------------------------------------------------------------------
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 个答案:

答案 0 :(得分:0)

来自Unix& amp;的@RomanPerekhrest慷慨解答Linux,但也希望它也包括在内。

D/REALM_JAVA: Network request (authenticate): url D/REALM_JAVA: AuthenticateResponse. Identity 9d83f9775ebba4deac9003d336b9f4c4; Path /account_1 D/REALM_JAVA: Access Token refreshed successfully, Sync URL: V/REALM_JNI: --> Java_io_realm_SyncSession_nativeRefreshAccessToken D/REALM_JAVA: Scheduling an access_token refresh in 349573 milliseconds 解决方案:

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指向整个匹配的字符串)