를 사용하여 sed
특정 문자열 앞(또는 뒤)에 나타나는 문자 뒤에 텍스트를 삽입하는 방법입니다 N
. 예를 들어 편집하려는 텍스트 줄이 다음과 같다고 가정합니다.
command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'
텍스트 파일에서 이 줄을 찾은 후(아마도 고유한 문자열을 통해 command
) 그 앞의 두 번째(N=2) 세미콜론 뒤에 텍스트를 삽입하고 싶습니다 keyword
(예: 세미콜론으로 구분된 lines
sum 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=2
insert 와 사이에 두 개의 필드가 있음을 의미합니다 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
(명령줄에 정의됨)에 포함된 문자열을 추가하여 네 번째 필드를 수정하고 수정된 필드와 함께 데이터를 출력합니다. 출력도 ;
-로 구분됩니다.