Como substituo o texto que está em um local específico de um arquivo pelo texto localizado em outro arquivo por um script bash?

Como substituo o texto que está em um local específico de um arquivo pelo texto localizado em outro arquivo por um script bash?

Digamos que eu tenha um arquivo de texto,arquivotobechanged.txt:

3.141592       pi
6.626068       planck

# Like this and like that and like this
..1     kd6-officer kd6-officer
us..0 kd6-3.7
us00..0 kd6-3.8
us00..0 kd6-3.9
us00..0 kd6-3.1

E eu tenho um segundo arquivo,subarquivo.txt:

subtext

Quero mudar a palavra na coluna dois, linha dois, dearquivotobechanged.txtcom a palavra emsubarquivo.txt; a palavra emsubarquivo.txtnem sempre será subtext; a palavra emarquivotobechanged.txtnem sempre será planck. Seria melhor presumir que ambas as palavras em ambos os arquivos serãosempreser palavras completamente diferentes.

Responder1

Para alterar os caracteres que não estão em branco antes do final da linha na linha 2, você pode usar

sed -i'' -e '2{s/[^[:blank:]]*$/'"$(cat subfile.txt)"'/;}' filetobechanged.txt

A -i''opção edita o arquivo no local (GNU/BSD sed). Sua palavra in subfile.txtpode não conter nenhum /caractere ou você terá que substituir o /'s no comando por um caractere não presente na palavra (por exemplo, @ou ,).

Responder2

Se você não se importa em preservar o espaço em branco entre os campos, isso funcionará usando qualquer awk em qualquer shell em cada caixa UNIX e com quaisquer caracteres em qualquer arquivo de entrada, pois está simplesmente fazendo uma atribuição de string literal:

awk 'NR==FNR{new=$0; next} NR==2{$2=new} 1' subfile.txt filetobechanged.txt

se você se importa então:

awk 'NR==FNR{new=$0; next} NR==2{sub(/[^[:space:]]+$/,""); $0=$0 new} 1' subfile.txt filetobechanged.txt

Para substituir a X-ésima palavra na linha Y usando GNU awk para o terceiro argumento para corresponder():

awk -v x=5 -v y=3 '
    NR==FNR { new=$0; next }
    FNR==y {
        match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
        $0 = a[1] new a[3]
    }
1' subfile.txt filetobechanged.txt

por exemplo:

$ cat subfile.txt
[[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]]

$ cat filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds that lour'd upon our house
In the deep bosom of the ocean buried.

$ awk -v x=5 -v y=3 '
    NR==FNR { new=$0; next }
    FNR==y {
        match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
        $0 = a[1] new a[3]
    }
1' subfile.txt filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds [[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]] lour'd upon our house
In the deep bosom of the ocean buried.

Se você quiser fazer algo semelhante, sedvejahttps://stackoverflow.com/q/29613304/1745001.

informação relacionada