Sed для обнаружения и замены текста МЕЖДУ двумя шаблонами

Вы можете сделать это, я написал большую документацию в этом ответе SO , в глобальном масштабе он работает с использованием uswsuspи правильной настройкой initramfs и Grub.

0
14.06.2019, 06:20
3 ответа

Замените $fileна свой$1:

file="bobby.js"
filename=$(basename "$file" '.js')
sed -i 's/\((lib\.\).*\( = function(mode,startPosition,loop) {\)/\1'"$filename"'\2/' "$file"
0
28.04.2021, 23:32

Начиная с @Freddy, но включая требование операционной системы о том, что совпадение должно быть между строками. Выполняется путем замены \nна NULLвместо sedс использованием

.
tr '\n' '\0'

, а затем переключать их обратно после sed.

f="bobby.js"
b=$(basename "$f" '.js')
pre="// stage content:\x00\(lib."             #pattern includes NULL (\x00)
post=" = function\(mode,startPosition,loop\)"
cat $f | tr '\n' '\0' | sed -E "s|($pre)[[:alnum:]]+($post)|\1$b\2|g" | tr '\0' '\n'

РЕДАКТИРОВАТЬ

Чистое sedрешение, не требующее возни сtr

f="bobby.js"
b=$(basename "$f" '.js')
pre="\/\/ stage content:"
mid="\(lib."
post=" = function\(mode,startPosition,loop\)"
sed -E "/^$pre$/{$!{ N;s|($pre\n$mid)[[:alnum:]]+($post)|\1$b\2|;ty;P;D;:y}}" $f

Это решение получено в результате тщательного изучения этой публикации и этой . Я надеюсь, что ваш мозг не болит так сильно, как мой, после их прочтения, но я многому научился в процессе.При всем уважении к постерам, включая @Peter.O

Мы недостойны!

постскриптум

Оригинал bobby.jsимеет неверный формат, поскольку открывающая и закрывающая фигурные скобки не совпадают

0
28.04.2021, 23:32

С GNU awk для gensub():

$ awk -v RS= '{ $0=gensub(/(.*\/\/\s+stage content:\s+\(lib\.)\S+(\s+=\s+function\(mode,startPosition,loop\)\s+\{.*)/,"\\1" gensub(/\.js$/,"",1,FILENAME) "\\2",1) } 1' bobby.js
// stage content:
(lib.bobby = function(mode,startPosition,loop) {
    stuff
}

Сделайте это awk -i inplace -v RS=..., если хотите редактировать "на месте".

0
28.04.2021, 23:32

Теги

Похожие вопросы