Comando Unix sed para encontrar vários padrões de string

0

O cenário aqui é que eu preciso substituir o valor "$$file_name=" . Eu tenho cerca de 150 nomes de arquivos em um arquivo como mencionado abaixo.

Exemplo: $$ file_name = abc.bbb.ccc to_be --- > $$ file_name = abc.bbb.cccV1

AS_IS:

$$a=abc.txt
$$file_name=abc.ddd.aaa
$$directory=/uasdua/asdsas

$$a=c.txt
$$file_name=ac.dd.ac
$$directory=/uasdua/asdsas

$$a=b.txt
$$file_name=ee.d.a
$$directory=/uasdua/asdsas
.
.
.
.
.
.
$$a=b.txt
$$directory=/uasdua/asdsas
$$file_name=e.d.a

to_be:

$$a=abc.txt
$$file_name=abc.ddd.aaaV1
$$directory=/uasdua/asdsas

$$a=c.txt
$$file_name=ac.dd.acV1
$$directory=/uasdua/asdsas

$$a=b.txt
$$file_name=ee.d.aV1
$$directory=/uasdua/asdsas
.
.
.
.
.
.
$$a=b.txt
$$directory=/uasdua/asdsas
$$file_name=e.d.aV1

Isso é o que eu tentei

select NAME from xxx where DATE='07/12/1999' > Name_file

#version will be same for that day
FILE_VERSION='db2 -x "select version from xxx where DATE='07/12/1999'"' > version_name
FILE_VER='cat version_name | head -1'

while read filename
 do
    FILE_NAME1='echo ${filename}${FILE_VER}'
    sed -f pattern.txt input > output
done < file_name11

pattern.txt

echo "$filename"
echo "$FILE_NAME1"
s/${filename}/${FILE_NAME1}/g ---> If I hardcode this one its not working..the value is not replaced..
s/ee.d.a/ee.d.aV1/g --> this is working

Preciso passá-lo explicitamente..Tenho 150 nomes de arquivo em um arquivo?

por user43067 15.07.2013 / 16:07

7 respostas

1

Veja como eu realizaria isso:

$ sed -e '/^$$file_name/ s|$|V1|' AS_IS

isso encontra strings que começam com "$ file_name ..". Para essas strings, faremos uma pesquisa e substituição. O $ é o final da string, então estamos essencialmente anexando um V1 a cada uma dessas strings correspondidas. Você pode redirecionar esses resultados para um arquivo assim:

$ sed -e '/^$$file_name/ s|$|V1' AS_IS > to_be
    
por 15.07.2013 / 21:48
0

Você pode usar

sed -i -e 's/\$\$file_name=.*/&V1/' file.txt   
    
por 15.07.2013 / 16:22
0

Tente esta solução. Trabalhou para mim:

sed -i 's/\$\$file_name.*/&V1/' foobar

onde foobar é seu arquivo de entrada.

    
por 15.07.2013 / 16:38
0

Eu escreveria isso como

sed -i '/^\$\$file_name=/ s/$/V1/' file
    
por 15.07.2013 / 17:27
0

Se você quiser usar um "arquivo de comando" com sed você pode colocar o seguinte no arquivo

s/\$\$file_name=.*/&V1/

Execute o processo como segue

sed -f pattern.txt <AS_IS >to_be
    
por 16.07.2013 / 10:16
0

Esta foi a solução com a qual fui:

while read filename
 do
echo "s/${file_name}(0)/${file_name}(${file_ver})/g" >> replaceMFNames.txt    
done < file_name11
sed -f replaceMFNames.txt inputfile > outputfile
    
por 17.07.2013 / 08:06
0

Você pode analisar os dados diretamente no DB2. Se você quiser usar expressões regulares, use xQuery e, em seguida, produza a saída desejada. Dessa forma, você não precisa lidar com sed.

    
por 25.08.2014 / 15:06