![Bash에서 n 번째 발생 후에 텍스트를 추가하는 방법은 무엇입니까?](https://rvso.com/image/169443/Bash%EC%97%90%EC%84%9C%20n%20%EB%B2%88%EC%A7%B8%20%EB%B0%9C%EC%83%9D%20%ED%9B%84%EC%97%90%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
helloworld.txt가 있다고 가정해 보겠습니다.
hello world
sed 사용:
sed 's/w*/goodbye/' helloworld.txt
나에게 제공:
goodbyehello world
그리고:
sed 's/$/goodbye/' helloworld.txt
나에게 제공:
hello worldgoodbye
그런데 텍스트를 어떻게 추가하나요?~ 후에첫 번째 발생이므로 다음과 같습니다.
hellogoodbye world
답변1
특정 발생 전후에 텍스트를 삽입하는 것에 대해 이야기한다고 가정합니다.단어한 줄의 텍스트로.
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/newword &/'
newword word1 word2 word3 word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/'
word1 newword word2 word3 word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/2'
word1 word2 newword word3 word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/3'
word1 word2 word3 newword word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/4'
word1 word2 word3 word4 newword
newword
그러면 주어진 문자열의 다른 위치에 문자열(및 앞의 공백)이 삽입됩니다 .
표현식sed
s/\<[[:alnum:]]\{1,\}\>/& newword/2
영숫자 문자로만 구성된 비어 있지 않은 문자열의 두 번째 일치 항목을 대체합니다.
측면 \<
및 \>
일치는 각각 일치의 시작과 끝에서 단어와 비단어 사이의 너비가 0인 경계와 일치합니다(GNU에서는 이를 위해 sed
사용할 수도 있습니다 \b
). 이렇게 하면 전체 단어가 일치하는 것을 보장하지만 주어진 데이터에는 실제로 필요하지 않습니다(나는 내가 하고 있는 일의 의도를 강조하기 때문에 단어 경계 패턴을 사용합니다).
는 확장 정규식으로 \{1,\}
작성되고 이전 패턴을 한 번 이상 일치시키는 수정자입니다 (단, 기본적으로 기본 정규식을 사용함).+
sed
교체 부분에는 &
실제로 패턴과 일치하는 입력 문자열의 비트가 되며, 2
마지막 부분에는 두 번째 비중복 일치에 대해서만 대체가 발생하도록 하는 플래그가 있습니다.
예시귀하의 의견에(거의 동일하지만 공백을 삽입하지 않음):
$ echo '7DF258 01DB-MET-RX PASS' | sed 's/\<[[:alnum:]-]\{1,\}\>/&FIDUCIAL/'
7DF258FIDUCIAL 01DB-MET-RX PASS
$ echo '7DF258 01DB-MET-RX PASS' | sed 's/\<[[:alnum:]-]\{1,\}\>/&FIDUCIAL/2'
7DF258 01DB-MET-RXFIDUCIAL PASS
주석에 제공한 예에서 "단어"에는 대시도 포함되어 있으므로 [[:alnum:]-]
그냥 [[:alnum:]]
.