캡처 그룹의 문자를 sed로 바꾸는 방법

캡처 그룹의 문자를 sed로 바꾸는 방법

다음과 같은 형태의 패턴이 주어졌습니다.

a\b\c\d:text\text

sed 출력을 사용하는 방법

a/b/c/d:text\text

즉, 백슬래시, 콜론, 임의 텍스트를 차례로 사용하는 경로가 있는 경우 콜론 앞의 백슬래시만 슬래시로 바꾸려면 어떻게 해야 합니까?

답변1

이를 수행하는 방법에는 여러 가지가 있습니다.

sed -e ':a' -e 's_^\([^:]*\)\\_\1/_;t a'

탐색경로 지침:

-e편집 명령을 지정합니다. 여기에는 두 가지 명령이 있습니다.

:a"goto" 문에 사용할 수 있는 레이블을 정의합니다.

s명령은 첫 번째 백슬래시가 콜론 문자 앞에 나타나는 한 줄의 첫 번째 백슬래시를 슬래시로 바꿉니다.

이 명령을 사용하여 교체에 성공하면 t a명령이 레이블로 분기됩니다. (조건은 "이동"입니다.):as

답변2

awk대신 사용하십시오 sed:

awk -v FS=':' -v OFS=':' '{ gsub(/\\/,"/",$1) } { print }'

이는 데이터를 :--delimited 레코드로 처리하고 gsub()첫 번째 필드의 모든 백슬래시를 슬래시로 바꿉니다. 그런 다음 수정된 데이터를 출력합니다.

입력 필드 구분 기호( FS)와 출력 필드 구분 기호( OFS) 를 설정하여 :입력이 콜론으로 분할되어 나중에 출력이 발생할 때 콜론이 다시 삽입되도록 설정했습니다.


셸 변수에 텍스트가 있는 경우 외부 유틸리티를 사용하지 않고 셸에서 직접 이 작업을 수행할 수 있습니다.

a='a\b\c\d:text\text'
b=${a%%:*}  # the start of the string ("remove the first : and everything after it from $a")
c=${a#*:}   # the end of the string ("remove the first : and everything before it from $a")

a="${b//\\//}:$c"

printf '%s\n' "$a"

a/b/c/d:text\textsh이 코드 조각은 매개변수 확장 ${parameter//pattern/string}(POSIX 표준 확장)을 지원하는 모든 셸에서 문자열을 인쇄합니다 .

awk이는 코드를 다소 모방하는 것입니다 .

관련 정보