Как заменить текст, находящийся в определенном месте файла, текстом, находящимся в другом файле, с помощью скрипта bash?

Как заменить текст, находящийся в определенном месте файла, текстом, находящимся в другом файле, с помощью скрипта bash?

Допустим, у меня есть текстовый файл,файл, который нужно изменить.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

И у меня есть второй файл,подфайл.txt:

subtext

Я хочу изменить слово во второй колонке, второй строкефайл, который нужно изменить.txtсо словом вподфайл.txt; слово вподфайл.txtне всегда будет subtext; слово вфайл, который нужно изменить.txtне всегда будет planck. Лучше всего предположить, что оба слова в обоих файлах будутвсегдабыть совершенно разными словами.

решение1

Чтобы изменить непустые символы перед концом строки в строке 2, вы можете использовать

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

Опция -i''редактирует файл на месте (GNU/BSD sed). Ваше слово in subfile.txtможет не содержать никаких /символов, или вам придется заменить /'s в команде на символ, отсутствующий в word (например, @или ,).

решение2

Если вас не волнует сохранение пробелов между полями, это будет работать с использованием любого awk в любой оболочке на любой машине UNIX и с любыми символами в любом входном файле, поскольку это просто выполнение буквального строкового присваивания:

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

если вас это волнует, то:

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

Чтобы заменить X-е слово в Y-й строке с помощью GNU awk для 3-го аргумента match():

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

например:

$ 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.

Если вы хотите сделать что-то подобное, sedто смотритеhttps://stackoverflow.com/q/29613304/1745001.

Связанный контент