문제 검색 및 바꾸기

문제 검색 및 바꾸기

AAsomeArbitraryStringBB모든 항목 을 찾아서 CCsomeArbitraryStringDD.

그래서

AAHelloBB
Text
AAByeByeBB

~이 되다

CCHelloDD
Text
CCByeByeDD.

대체 문자열에는 검색 문자열의 일부가 포함되어 있다는 점에 유의하는 것이 중요합니다.

답변1

이는 명령의 기본 작업입니다 sed.

sed 's/AA\(someArbitraryString\)BB/CC\1DD/g'

마지막으로 모든 "임의 문자열"에 대해 이 작업을 수행하려면 다음을 수행하십시오.

sed 's/AA\(.*\)BB/CC\1DD/g'

답변2

sed "s/\([AB]\)\1\1*/\n&\n/g
     s/AA\n\([[:alnum:]]\{1,\}\)\nBB/CC\1DD/g
     s/\n//g
" <<\INPUT
AAHelloBB Text AAByeByeBB
INPUT

AA>>CC&&BB>>DD나는 대체가 두 세트 사이에 하나 이상의 영숫자 문자가 있을 때만 수행되어야 하며 항상 가능한 상황에 최대한 가까워야 한다고 생각합니다 .

예제에서는 다음을 인쇄합니다.

CCHelloDD Text CCByeByeDD

가장 어려운 부분은 s///첫 번째 교체 문에서 수행됩니다. 패턴 공간에서 모든 항목의 머리 부분과 끝 부분에 eline 문자를 배치합니다 \n. 분리는 때때로 까다로울 수 있습니다. 종종 선행 구분 기호를 배치하면 후행 구분 기호의 위치가 변경될 수 있으며 그 반대의 경우도 마찬가지입니다. 편집 내용을 편집할 필요가 없도록 가능할 때마다 단일 범위 내에서 이 단계를 수행하려고 합니다.AAA*BBB*

그래서 우리는 그것을 안에서 밖으로 볼 것이지만 결과 패턴의 모든 발생에 대해 패턴 공간은 왼쪽에서 오른쪽으로 스캔된다는 점을 고려해야 합니다. 왜냐하면 전역 플래그를 끝에 sed추가하기 때문입니다. g대체문.s///

  • [AB]- 스캔이 첫 번째 또는 시리즈 중 하나를 발견하면 sed스캔이 일시 중지됩니다. 다음에는 다음을 찾습니다...AB
  • \([AB]\)\1\1*- 시퀀스가 ​​계속되는 한 바로 뒤에 나오는 동일한 문자 하나 이상 및 연속된 동일한 문자 중 일부/모두. 역참조를 사용하여 해당 내용을 참조할 수 있도록 [AB]문자 클래스를 \(하위 표현식 으로 그룹화 합니다 . \)\1
    • [AB]\{2,\}이는 수행과는 다르며, \([AB]\)\{2,\}이러한 경우에는 및 sed둘 다 패턴과 일치하는 것으로 간주되기 때문입니다. 대신 여기서 일치 그룹에 추가된 모든 문자는 위의 첫 번째 일치 항목과 동일합니다 .AB[AB]
  • \n&\n- 교체 오른쪽에는 s///방금 일치한 전체 시퀀스를 인용하고 시작과 끝 부분에 줄바꿈 문자를 &삽입합니다 .\n
    • 많은 s는 ewline의 오른쪽에서 백슬래시 이스케이프를 sed지원하지 않습니다 . \n이런 경우에는 \n대신 리터럴 ewline 문자를 사용할 수 있습니다 n.

l예제 입력 문자열에 대한 대체 결과는 다음과 같습니다 .s///

\nAA\nHello\nBB\n Text \nAA\nByeBye\nBB\n

\n추가 ewline 문자를 삽입하는 것 외에도sed(이것은 편집 후에 패턴 공간에만 나타날 수 있는 거의 유일한 문자입니다 .) sed문자열은 전혀 변경되지 않습니다. 입력 문자는 수정되지 않습니다.

AAA*또한 이제 각 OR 시퀀스가 ​​ewlines BBB*내에 즉시 포함되는 것을 볼 수 있습니다 . 그래서 다음번 글로벌 교체 \n작업을 할 때 이렇게 말씀드립니다 .gs///sed

  • AA\n- 각 게임은 시퀀스가 ​​끝난 직후부터 시작됩니다 AAA*.
  • \([[:alnum:]]\{1,\}\)- 하나 이상의 영숫자 문자입니다. 지금 바로 다음 BBB*장소 가AAA*BBB*\n그들 사이에는 중간선이 있습니다. 이 영숫자 시퀀스 뒤에는 다음이 와야 합니다.
  • \nBB- 시퀀스의 선두 BBB*.

그리고 오른쪽에는...

  • CC\1DDAA\n- w/를 그 자체로, w /로 대체합니다.CC \1\nBBDD

이 시점에서 한 l장면이 공개됩니다 ...

\nCCHelloDD\n Text \nCCByeByeDD\n

...완전히 성공했습니다! 이제 우리가 해야 할 일은...

`s/\n//g`

...나머지 \n줄 구분 기호를 모두 제거하면 작업이 완료됩니다.

이는 키보드를 몇 초 동안 무작위로 두드린 결과가 입력으로 렌더링된 결과입니다. 이것은 훨씬 더 복잡한 입력 예이므로 \n여기 문서에서 이스케이프된 줄을 사용하여 분할했습니다. 셸은 한 줄 결과를 입력에 전달하기 sed전에 여기에서 볼 수 있는 모든 줄 바꿈을 제거합니다 .

sed ... <<IN
AA  kj \
BB\
AAAAAABAkl\
AAAAasjd\
AAAAfo\
BB\
AAia\
BBsdfjomAl\
BBks\
BBmdlmdsviom\
BB\
AAiodsvgmnoi
IN

...그리고 l첫 번째 교체 s///후의 ook :

\nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAAAA\nfo\nBB\n\nAA\nia\nBB\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi

...그리고 두 번째는...

\nAA\n kj \nBB\n\nAAAAAA\nBAkl\nAAAA\nasjd\nAACCfoDD\n\nCCiaDD\nsdfjomAl\nBB\nks\nBB\nmdlmdsviom\nBB\n\nAA\niodsvgmnoi

...그리고 최종 제품은...

AA kj BBAAAAAABAklAAAAasjdAACCfoDDCCiaDDsdfjomAlBBksBBmdlmdsviomBBAAiodsvgmnoi

관련 정보