Как найти строку в файлеА, выбрать из нее текст и заменить строку в файлеВ?

Политика (ранее)
$ apt policy firefox
firefox:
  Installed: 48.0+linuxmint1+sarah
  Candidate: 48.0+linuxmint1+sarah
  Version table:
     49.0~b2+build1-0ubuntu0.16.04.1 500
        500 http://ppa.launchpad.net/mozillateam/firefox-next/ubuntu xenial/main amd64 Packages
 *** 48.0+linuxmint1+sarah 700
        700 http://mint-mirror.gwendallebihan.net/packages sarah/upstream amd64 Packages
        100 /var/lib/dpkg/status
     48.0+build2-0ubuntu0.16.04.1 500
        500 http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu xenial-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages
     45.0.2+build1-0ubuntu1 500
        500 http://ftp.u-picardie.fr/mirror/ubuntu/ubuntu xenial/main amd64 Packages

Политика APT

$ cat /etc/apt/preferences.d/official-extra-repositories.pref
Package: *
Pin: origin build.linuxmint.com
Pin-Priority: 700

Решение

На основе Как выбрать пакеты из PPA? {{1 }} Добавьте следующее правило в /etc/apt/preferences.d/official-extra-repositories.pref , чтобы установить приоритет PPA (будет использоваться наивысший Pin-Priority ) :

Package: *firefox*
Pin: release o=LP-PPA-mozillateam-firefox-next
Pin-Priority: 800

Затем обновите и обновите

sudo apt-get update
sudo apt-get upgrade
2
11.08.2017, 22:27
4 ответа
awk 'FNR==NR && $2 == "Weight:"{ weights[spotted++]=$3} FNR!=NR && $1 != "WGHT" { print } FNR!=NR && $1=="WGHT" { print "WGHT", weights[replaced++]} ' in1 in2 > out2

Это создаст новый файл out2с нужными вам выходными данными. Затем его можно перемещать куда угодно.

$ cat out2
asdajskdha
kjashdjahsd
WGHT 0.546
4
27.01.2020, 21:49

На самом деле вы можете сделать это с помощьюsed(и другого инструмента для сопоставления с первым файлом ). Например:

$ sed -E "s/(WGHT\s*).*/\1$(grep -oP 'Recommended Weight: \K[0-9.]+' fileA)/" fileB 
asdajskdha
kjashdjahsd
WGHT 0.546

Или просто сначала сохраните его в переменной:

$ wght=$(sed -En 's/Recommended Weight: *([0-9.]+)/\1/p' fileA)
$ sed -E "s/(WGHT\s*).*/\1$wght/" fileB
asdajskdha
kjashdjahsd
WGHT 0.546 
5
27.01.2020, 21:49

Этот скрипт создает new_file_b.txt.

Использование:./script.sh file_a.txt file_b.txt > new_file_b.txt

#!/bin/bash

awk '
/Recommended Weight: /{
    value=$3;
}
NR != FNR {
    if($1 == "WGHT") {
        print $1 OFS value; 
    } else {
        print;
    }
}
' "$1" "$2"
3
27.01.2020, 21:49

С помощью GNU sedвы можете сделать это следующим образом:

sed -Ez '
   N;s/.*\nRecommended Weight: (\S+)\n.*\x00(.*\nWGHT[[:blank:]]+)\S+\n/\2\1\n/
' fileA fileB

Там, где опция -Eвключает опции extended regex facilityи -z, каждый файл обрабатывается как одна строка, а несколько файлов разделяются нулем (\0).

0
27.01.2020, 21:49

Теги

Похожие вопросы