다음과 같은 형태의 패턴이 주어졌습니다.
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
명령이 레이블로 분기됩니다. (조건은 "이동"입니다.):a
s
답변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\text
sh
이 코드 조각은 매개변수 확장 ${parameter//pattern/string}
(POSIX 표준 확장)을 지원하는 모든 셸에서 문자열을 인쇄합니다 .
awk
이는 코드를 다소 모방하는 것입니다 .