我尝试编写一个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
-------------------------------------------------------------------------------
答案 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
指向整个匹配的字符串)