как заменить несколько строк текста новым текстом - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть:

SIESTA_ARCH = unknown
CC = gcc
FPP = $(FC) -E -P -x c 
FC = gfortran 

, и я хочу заменить это на

SIESTA_ARCH = amd64 (x86_64) 
CC = mpicc 
FPP = $(FC) -E -P -x c 
FC = mpif90

Ответы [ 3 ]

1 голос
/ 18 апреля 2020

Я думаю, что следующее решение работает для вас ( отредактированное решение согласно ответам ПО):

script.sed

#!/bin/sed -f

/^SIESTA_ARCH = unknown/,/^FC =/{
  s/^SIESTA_ARCH =.*/SIESTA_ARCH = amd64 (x86_64)/
  s/^CC =.*/CC = mpicc/
  s/^FC =.*/FC = mpif90/
}

Вызвать как ./script.sed Makefile, чтобы увидеть результаты на стандартном выводе, или как ./script.sed -i Makefile, чтобы обновить файл Makefile.

Это решение изменит все вхождения SIESTA_ARCH = unknown и следующий блок строки до строки, начинающейся с FC = в новые значения.

0 голосов
/ 19 апреля 2020

Если у вас есть ed

cat script.ed
H
g/^\(SIESTA_ARCH =\)\(.\+\)$/s//\1 amd64 (x86_64)/
g/^\(CC =\)\(.\+\)$/s//\1 mpicc/
,p
Q

Использование сценария для вашего файла.

ed -s Makefile < script.ed

Вывод

SIESTA_ARCH = amd64 (x86_64)
CC = mpicc
FPP = $(FC) -E -P -x c
FC = gfortran

Теперь измените ,p Q до w и q Для редактирования файла на месте.

H
g/^\(SIESTA_ARCH =\)\(.\+\)$/s//\1 amd64 (x86_64)/
g/^\(CC =\)\(.\+\)$/s//\1 mpicc/
w
q
ed -s Makefile < script.ed
0 голосов
/ 18 апреля 2020

В bash вы можете определить функцию, подобную этой (просто запустите эту однострочную строку в терминале или скрипте):

function repl() { FIND="$2" REPLACE="$3" ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" "$1"; }

Затем вы можете заменить любые литеральные строки, которые вы хотите в любом файле, Например:

repl ~/Code/Makefile 'SIESTA_ARCH = unknown' 'SIESTA_ARCH = amd64 (x86_64)'
repl ~/Code/Makefile 'CC = gcc' 'CC = mpicc'
repl ~/Code/Makefile 'FC = gfortran' 'FC = mpif90'

Обратите внимание, что это заменит все вхождения таких строк в указанном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...