我正在尝试编写一个 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
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 = ...
错过了) - 在它前面加上 default lineELLIPSOID_CODE = DEFAULT
。 (&
指向整个匹配的字符串)
答案2
首先,我找到了模式 OUTPUT_PARAMETER 的行号。然后将变量 j 分配给第二次存在的模式的行号,然后我根据要求替换行号。如有任何疑问请告诉我
命令
j=`sed -n '/OUTPUT_PARAMETER/{;=;p}' filename|sed 'N;s/\n/ /g'| awk 'NR==2{print $1}' | sed -r "s/\s+//g" | sed '/^$/d'`
sed "`echo $j`s/OUTPUT_PARAMETER = BLAH/ELLIPSOID_CODE = DEFAULT\n&/g" filename
输出
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