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