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.txt
pode 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, sed
vejahttps://stackoverflow.com/q/29613304/1745001.