Shell Script .SH заменяет определенный раздел в файле
Я пытаюсь создать файл.sh, в котором он будет читать указанный файл, искать конкретный текст и заменять этот раздел другим текстом.
Предположим, у нас есть somefile.js.
Может ли скрипт оболочки искать это:
"scripts": [
"../node_modules/something.js"
],
и заменить его на
"scripts": [
"../node_modules/something1.js",
"../node_modules/something2.js"
],
Можно ли это сделать вообще? Если так, как?
2 ответа
Да, вы можете использовать sed для замены текстов в файлах.
sed '/s/one/two/' < old.txt > new.txt
Этот небольшой пример заменяет все одно на два в old.txt и выводит результат в new.txt.
sed для простых замен в отдельных строках, вот и все. Для всего остального вы должны использовать awk для ясности, надежности, эффективности и т. Д. И т. Д. См. Возможно ли надежно избежать метасимволов регулярных выражений с помощью sed для некоторых из обручей, через которые вам придется прыгать, чтобы даже НАЧАТЬ подумать о создании надежный сценарий sed для этой работы.
Простой, надежный способ сделать то, что вы хотите (в этом случае с помощью GNU awk для RS с несколькими символами):
$ cat tst.awk
BEGIN { RS="^$"; ORS="" }
ARGIND==1 { old=$0; next }
ARGIND==2 { new=$0; next }
s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
{ print }
$ cat old
"scripts": [
"../node_modules/something.js"
],
$ cat new
"scripts": [
"../node_modules/something1.js",
"../node_modules/something2.js"
],
$ cat file
foo
"scripts": [
"../node_modules/something.js"
],
bar
$ awk -f tst.awk old new file
foo
"scripts": [
"../node_modules/something1.js",
"../node_modules/something2.js"
],
bar