sed: 주어진 문자열 앞/뒤의 N번째 문자 뒤에 텍스트를 삽입합니다.

sed: 주어진 문자열 앞/뒤의 N번째 문자 뒤에 텍스트를 삽입합니다.

를 사용하여 sed특정 문자열 앞(또는 뒤)에 나타나는 문자 뒤에 텍스트를 삽입하는 방법입니다 N. 예를 들어 편집하려는 텍스트 줄이 다음과 같다고 가정합니다.

command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'

텍스트 파일에서 이 줄을 찾은 후(아마도 고유한 문자열을 통해 command) 그 앞의 두 번째(N=2) 세미콜론 뒤에 텍스트를 삽입하고 싶습니다 keyword(예: 세미콜론으로 구분된 linessum of). 특히 sed이런 용도 로 사용하고 싶습니다 .

예제를 계속하면 예상되는 출력은 다음과 같습니다.

command -some -args -c 'a quoted section;some;lines;INSERTED_STRING;of code;keyword;more lines;etc();'

이는 INSERTED_STRING;(예를 들어 쉘 변수를 통해 sed에 제공됨) 원하는 위치에 삽입됩니다.

답변1

나는 단순한 것을 선호합니다:

sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'

키워드 앞에 두 개의 필드를 삽입합니다. 일반적인 해결책은

sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"

그러나 N귀하의 질문에 비해 오프셋은 1: 여기서는 N=2insert 와 사이에 두 개의 필드가 있음을 의미합니다 keyword.

설명: /command/이 있는 행만 선택되었으므로 command다른 행은 변경되지 않습니다. ([^;]*;\)다음 세미콜론(세미콜론이 아닌 시퀀스)을 포함하는 필드와 일치합니다. 그 뒤에 \{$N\}패턴 일치 필드를 추가합니다 $N. 다음은 이전 필드 와 마찬가지로 keyword이 일치를 완료합니다 . 대체 패턴은 삽입된 문자열로 구성되며 일치하는 모든 항목으로 대체됩니다(따라서 결국 대체가 아니라 삽입이 됩니다).keyword$N&

확장 정규식을 사용하면 짧고 읽기 쉽습니다.

sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"

답변2

를 사용하면 sed패턴의 세 번째 항목(여기서는 세미콜론)만 변경할 수 있습니다.

sed 's/;/;INSERTED_STRING;/3' <<<"$string"

편집하다: 다른 특정 문자열 이전에 N 번째로 나타나는 문자열을 바꿉니다.패턴 문자열 keyword("상대 발생", 귀하의 경우 두 번째 발생 ) 행이 uniqe 문자열과 일치하는 경우 command. ):

sed -r '/command/ s/([^;]*;){1}keyword/INSERTED_STRING;&/' <<<"$string"

답변3

;- 구분 기호 비트를 레코드 필드로 처리하는 경우 awk다음과 같이 수행할 수 있습니다.

$ awk -F';' -vOFS=';' -vstring="NEW TEXT" '{ $4 = $4 ";" string; print }' file
command -some -args -c 'a quoted section;some;lines;of code;NEW TEXT;keyword;more lines;etc();'

awk-F';'행을 - file;구분된 여러 필드 로 분할 합니다 . 그런 다음 코드는 추가 내용 ;과 변수 string(명령줄에 정의됨)에 포함된 문자열을 추가하여 네 번째 필드를 수정하고 수정된 필드와 함께 데이터를 출력합니다. 출력도 ;-로 구분됩니다.

관련 정보