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
Другие вопросы по тегам