Shell Script que analisa vários arquivos e adiciona uma linha se uma condição for atendida?

1

Estou tentando escrever um script de shell que leia mais de cem arquivos contendo várias seções de parâmetros em cada arquivo, apenas para modificar uma linha. Se uma seção em um arquivo não contiver ELLIPSOID_CODE = 123 , inclua na linha ELLIPSOID_CODE = DEFAULT antes de OUTPUT_PARAMETER . Se uma seção em um arquivo contiver ELLIPSOID CODE = 123 , não faça nada. Estou tendo problemas para analisar o shell script para que isso funcione. Eu tenho um exemplo de um arquivo e minha tentativa de código abaixo.

-----------------------------------------------------------------------   ------
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

Meu código adiciona no ELLIPSOID_CODE = DEFAULT em cada seção, não importa, quando eu só quero adicionar essa linha na segunda seção apenas deste arquivo. Só para esclarecer, estou tentando fazer com que pareça assim:

-----------------------------------------------------------------------------
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

-------------------------------------------------------------------------------
    
por dhboots 11.01.2018 / 22:28

2 respostas

3

sed solução:

sed -i '/^OUTPUT_PROJECTION_TYPE = .*/{ 
           N; s/OUTPUT_PARAMETER = .*/ELLIPSOID_CODE = DEFAULT\n&/; 
       }' /home/autotest/test/*
  • /^OUTPUT_PROJECTION_TYPE = .*/ - para cada linha iniciada com o padrão OUTPUT_PROJECTION_TYPE = .* (onde ^ é a âncora regex indicando o início da cadeia / linha):
    • N - adicione uma nova linha ao espaço de padrão e, em seguida, anexe a próxima linha de entrada ao espaço de padrão
    • s/OUTPUT_PARAMETER = .*/ELLIPSOID_CODE = DEFAULT\n&/ - se a próxima linha for OUTPUT_PARAMETER = .* (o que significa que ELLIPSOID_CODE = ... está ausente) - coloque o prefixo com a linha padrão ELLIPSOID_CODE = DEFAULT . ( & aponta para a string combinada inteira)
por 11.01.2018 / 22:38
0

Primeiro eu encontrei os números de linha para o padrão OUTPUT_PARAMETER. Em seguida, atribui a variável j ao número da linha do padrão existe segunda vez e, em seguida, eu substitui no número da linha como por requisito. Deixe-me saber por alguma dúvida

comando

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

saída

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
    
por 12.01.2018 / 20:10