bash에서 n 번째 발생 후 텍스트를 추가하는 방법은 무엇입니까?

bash에서 n 번째 발생 후 텍스트를 추가하는 방법은 무엇입니까?

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

주석에 제공한 예에서 "word"에는 대시도 포함되어 있는데, 이는 내가 [[:alnum:]-]그냥 대신 사용한 것입니다 [[:alnum:]].

관련 정보