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