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

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

我正在尝试编写一个 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 line ELLIPSOID_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

相关内容