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
스캔이 일시 중지됩니다. 다음에는 다음을 찾습니다...A
B
\([AB]\)\1\1*
- 시퀀스가 계속되는 한 바로 뒤에 나오는 동일한 문자 하나 이상 및 연속된 동일한 문자 중 일부/모두. 역참조를 사용하여 해당 내용을 참조할 수 있도록[AB]
문자 클래스를\(
하위 표현식 으로 그룹화 합니다 .\)
\1
[AB]\{2,\}
이는 수행과는 다르며,\([AB]\)\{2,\}
이러한 경우에는 및sed
둘 다 패턴과 일치하는 것으로 간주되기 때문입니다. 대신 여기서 일치 그룹에 추가된 모든 문자는 위의 첫 번째 일치 항목과 동일합니다 .A
B
[AB]
\n&\n
- 교체 오른쪽에는s///
방금 일치한 전체 시퀀스를 인용하고 시작과 끝 부분에 줄바꿈 문자를&
삽입합니다 .\n
- 많은 s는 ewline의 오른쪽에서 백슬래시 이스케이프를
sed
지원하지 않습니다 .\n
이런 경우에는\n
대신 리터럴 ewline 문자를 사용할 수 있습니다n
.
- 많은 s는 ewline의 오른쪽에서 백슬래시 이스케이프를
l
예제 입력 문자열에 대한 대체 결과는 다음과 같습니다 .s///
\nAA\nHello\nBB\n Text \nAA\nByeBye\nBB\n
\n
추가 ewline 문자를 삽입하는 것 외에도sed
(이것은 편집 후에 패턴 공간에만 나타날 수 있는 거의 유일한 문자입니다 .) sed
문자열은 전혀 변경되지 않습니다. 입력 문자는 수정되지 않습니다.
AAA*
또한 이제 각 OR 시퀀스가 ewlines BBB*
내에 즉시 포함되는 것을 볼 수 있습니다 . 그래서 다음번 글로벌 교체 \n
작업을 할 때 이렇게 말씀드립니다 .g
s///
sed
AA\n
- 각 게임은 시퀀스가 끝난 직후부터 시작됩니다AAA*
.\([[:alnum:]]\{1,\}\)
- 하나 이상의 영숫자 문자입니다. 지금 바로 다음BBB*
장소 가AAA*
BBB*
둘\n
그들 사이에는 중간선이 있습니다. 이 영숫자 시퀀스 뒤에는 다음이 와야 합니다.\nBB
- 시퀀스의 선두BBB*
.
그리고 오른쪽에는...
CC\1DD
AA\n
- w/를 그 자체로, w /로 대체합니다.CC
\1
\nBB
DD
이 시점에서 한 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