연속된 패턴을 일치시켜 다른 패턴 뒤에 삽입하는 방법

연속된 패턴을 일치시켜 다른 패턴 뒤에 삽입하는 방법

2줄이 포함된 파일이 있습니다.

1, output /test here    
2, output /test here

나는 이것을 다음과 같이 바꾸고 싶습니다 :

1, output /test 1 here    
2, output /test 2 here

이전 문자열을 ,이 문자열의 끝에 복사합니다 /test.

awk또는 을 사용하여 이 작업을 어떻게 수행할 수 있습니까 sed?

답변1

당신은 그것을 사용할 수 있습니다그룹 및 역참조 캡처전임자.

sed 's:\([^,]*\), output /test:& \1:' file

질문에도 태그를 지정했으므로 awk다음과 같은 작업을 수행할 수도 있습니다.

awk -F, 'match($0,/\/test/) {print substr($0,1,RSTART+RLENGTH) $1, substr($0,RSTART+RLENGTH+1)}' file

답변2

이 질문은 실제로 "줄의 첫 번째 쉼표 앞의 문자열"과 /test첫 번째 패턴(구분 공백 포함)과 일치하는 문자열이 복사되어야 하는 "문자열"에 대해서만 설명합니다.

sed 's/^\([^,]*\),.*\/test/& \1/' file

이는 전체 표현식과 일치하는 하위 문자열을 바꾸고 첫 번째 쉼표 앞에 공백과 일치하는 하위 문자열을 바꿉니다. 행의 내용에 대해 더 이상 가정하지 않습니다.

질문의 데이터 출력을 제공합니다.

1, output /test 1 here
2, output /test 2 here

/test텍스트를 줄 시작 부분의 하위 문자열로 바꾸 시겠습니까 (암시됨)댓글에서):

sed 's/^\(\([^,]*\),.*\)\/test/\1\2/' file

이는 sed첫 번째 명령과 같은 줄의 비트를 대체하지만 줄의 시작 부분부터 비트를 추가하는 대신 /test문자열에 끝이 포함되지 않습니다. 교체는 앞의 공백 문자를 재사용하므로 /test새 공백을 삽입할 필요가 없습니다.

동일한 입력 데이터로 출력:

1, output 1 here
2, output 2 here

답변3

sed -E 's/([0-9]*),\s([a-z].*\s.[a-z]*)\s([a-z].*)/\1 \2 \1 \3/'

sed해결책은 일치하는 항목을 그룹화하여 교체할 때 원래 값을 유지하면서 재배열할 수 있도록 하는 것입니다.

awk -F"[, ]" '{sub($4, $4" "$1)}1'

위의 awk솔루션은 열 4의 값을 열 4의 원래 값으로 바꾸고 /test여기에 열 1의 값을 추가합니다.

답변4

awk솔루션은 다음과 같은 도움이 될 수 있습니다.

awk '/\/test/ {$3=$3 " " $1;sub(/,$/,"",$3)} 1' file
1, output /test 1 here
2, output /test 2 here

관련 정보