Como adicionar time stamp (month_year) ao arquivo após a correspondência de uma string específica?

0

Eu quero adicionar o registro de data e hora dentro do arquivo somente após a correspondência de uma string específica,

formato do registro de data e hora: 03_2016

arquivo contém " $ channel_name Policy " string, eu quero substituir esta string por " $ channel_name Policy_03_2016 "

conteúdo do arquivo que desejo adicionar o registro de data e hora:

package_path=/LSB/Packages/Policy
channel_path=/LSB/Channels/$parent_channel_name/$channel_name Policy
erratum_path=/LSB/Errata/$erratum_type Policies/$erratum_name
errata_path =/LSB/Errata/$parent_channel_name/$channel_name Advisory Roll-Up Policy
package_path=/LSB/Packages/Unapproved/$channel_name

Formato de arquivo necessário:

package_path=/LSB/Packages/Policy
channel_path=/LSB/Channels/$parent_channel_name/$channel_name Policy_03_2016
erratum_path=/LSB/Errata/$erratum_type Policies/$erratum_name
errata_path =/LSB/Errata/$parent_channel_name/$channel_name Advisory Roll-Up Policy 
package_path=/LSB/Packages/Unapproved/$channel_name

Neste momento, estou usando o seguinte comando para adicionar registro de data e hora ao arquivo:

sed -i "s/$channel_name Policy/$channel_name Policy_$(date +%m_%Y)/g" filename

mas este comando está substituindo toda a ocorrência da Política por Policy_03_2016 assim:

package_path=/LSB/Packages/Policy_03_2016
channel_path=/LSB/Channels/$parent_channel_name/$channel_name Policy_03_2016
erratum_path=/LSB/Errata/$erratum_type Policies/$erratum_name
errata_path =/LSB/Errata/$parent_channel_name/$channel_name Advisory Roll-Up Policy_03_2016
package_path=/LSB/Packages/Unapproved/$channel_name 

Existe alguma solução para esta pergunta?

    
por Thejesh PR 24.03.2016 / 12:19

1 resposta

0

Como comentado por 'don_crissti', você tem que escapar do cifrão, caso contrário ele tenta obter um conteúdo variável (que está vazio no seu caso).

Alternativamente, seria mais seguro se você usar um separador diferente de '/', pois você também tem barras no seu arquivo. No entanto, não é um problema no seu caso, desde que você não os use na expressão de substituição.

Minha solução de trabalho:

sed -i 's!\$channel_name Policy!&_'$(date +%m_%Y)'!g' policies.txt

A segunda melhoria possível é o uso do & na substituição, já que é exatamente a expressão pesquisada mais alguns extras.

E em terceiro lugar, no meu teste, só consegui fazer com que o comando $(date +%m_%Y) funcionasse fora da expressão sed (agrupada por aspas simples).

Eu tentei em GNU sed (a linha acima) e com OSX sed , mas nenhum deles conseguiu interpretar corretamente o $(command) .

    
por 19.01.2017 / 22:54

Tags