Вы можете сделать это, я написал большую документацию в этом ответе SO , в глобальном масштабе он работает с использованием uswsusp
и правильной настройкой initramfs и Grub.
Замените $file
на свой$1
:
file="bobby.js"
filename=$(basename "$file" '.js')
sed -i 's/\((lib\.\).*\( = function(mode,startPosition,loop) {\)/\1'"$filename"'\2/' "$file"
Начиная с @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
имеет неверный формат, поскольку открывающая и закрывающая фигурные скобки не совпадают
С 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=...
, если хотите редактировать "на месте".