Sed는 두 패턴 사이의 텍스트를 찾아서 바꿉니다.

Sed는 두 패턴 사이의 텍스트를 찾아서 바꿉니다.

친애하는 Stack Exchange 커뮤니티 여러분,

다른 솔루션을 보았지만 정규식을 사용하는 데 어려움을 겪고 있으므로 이를 내 상황에 맞게 조정해야 합니다.

교체해야 하는 lib 개체 구성원 속성과 이름이 포함된 소프트웨어 생성 파일이 있습니다. 속성의 이름을 찾아 기본 파일 이름으로 바꾸려면 sed를 사용해야 합니다.

다음을 포함하는 bobby.js라는 .js 파일로 시작합니다.

// stage content:
(lib.Scenario2IntroFigure0 = function(mode,startPosition,loop) {
    stuff
}

동일한 bobby.js 파일로 끝나지만 이제는 다음과 같습니다.

// stage content:
(lib.bobby = function(mode,startPosition,loop) {
    stuff
}

참고: 장면 2 소개 그림 0다른불행히도 모든 파일에 대해.

내가 해야 할 일을 설명하는 유사 코드:

A. 다음 패턴 사이의 항목을 찾아 이전 이름을 분리합니다.

// stage content:
(lib.

B. 이 결말 패턴은 다음과 같습니다.

= function(mode,startPosition,loop) {

C. 다음 명령을 사용하여 파일 기본 이름 자체를 가져옵니다.

FILENAME=$(basename $1 '.js')

D. 이전 이름을 파일 기본 이름으로 바꾸고 다음과 같이 파일을 덮어씁니다.

sed -i "s/Scenario2IntroFigure0/$DA_FILE/g" $1

그러나 "Scenario2IntroFigure0"은 sed가 이 두 모드 사이에서 찾은 항목입니다.

답변1

$file다음으로 바꾸세요 $1:

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

답변2

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=..."제자리"를 편집하려면 다음을 수행하십시오.

답변3

@Freddy로 시작하지만 콘테스트를 통과하라는 OP의 요청을 포함합니다. 로 교체하여 사용을 \n완료하세요 .NULLsed

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여는 중괄호와 닫는 중괄호가 일치하지 않아 원본 형식이 잘못되었습니다.

관련 정보