n번째 구분 기호 이후의 모든 항목을 인쇄합니다.

n번째 구분 기호 이후의 모든 항목을 인쇄합니다.

n번째 구분 기호 뒤의 나머지 문자열(구분 기호가 없는 열뿐만 아니라)을 어떻게 인쇄합니까?

다음과 유사한 일련의 레지스트리 키가 포함된 텍스트 파일이 있습니다.

hku\test\user\software\microsoft\windows\currentversion\runonce\delete cached update binary

세 번째 문자 \이후의 모든 내용을 인쇄하고 싶습니다. 그래서 나는 출력을 찾고 있습니다.

software\microsoft\windows\currentversion\runonce\delete cached update binary

특정 열 인쇄를 사용하는 방법을 알고 있지만 구분 기호를 사용하여 열을 인쇄하는 대신 지정된 구분 기호를 사용하여 문자열을 분할 awk하는 쉬운 방법이 있습니까 ?bash

답변1

파이프가 통과합니다 cut -d \\ -f 4-.

echo 'hku\test\user\software\microsoft\windows\currentversion\runonce\delete cached update binary' | cut -d \\ -f 4-

생산하다:

software\microsoft\windows\currentversion\runonce\delete cached update binary

\\단일은 \이스케이프 문자이므로 이중에 유의하십시오 .

답변2

그리고 sed:

sed -E 's/^([^\]*[\]){3}//' infile

또는 동일 awk:

awk '{ sub(/([^\\]*[\\]){3}/, "") }1' infile

(regex)3회 반복되는 일치 항목입니다 [^\]*[\]. 백슬래시 문자 뒤에 오는 백슬래시(예외의 개행 문자 제외)를 제외한 모든 문자 중 0개 이상과 일치합니다.


및 쉘(POSIX sh/bash/Korn/zsh) 솔루션:

$ str='hku\test\user\software\microsoft\windows\currentversion\runonce\delete cached update binary'
$ for i in $(seq 3); do str="${str#*\\}"; done
$ printf '%s\n' "$str"

구문 은 다음 ${parameter#word}과 같습니다매개변수 확장, 인수에서 가장 짧은 접두사를 제거합니다.

답변3

사용 awk:

awk 'BEGIN{FS=OFS="\\"; }{for(i=4;i<NF;i++) printf "%s", $i OFS; print $NF }' input

세 번째 문자 \이후의 모든 내용을 인쇄하려고 하므로 필드 구분 기호 FS와 출력 필드 구분 기호 OFS는 로 설정됩니다 \. FS="\\"싱글은 \이스케이프 문자이기 때문입니다. 이것이 아카이브 구분 기호 이므로 \for 루프를 사용하여 아카이브 번호 4부터 레코드의 마지막 필드까지 인쇄합니다.

또는 다음과 같습니다:

awk 'BEGIN{FS=OFS="\\"; }{for(i=4;i<=NF;i++) printf "%s", $i (i==NF?ORS:OFS) }' input

여기에서는 모든 것이 동일하지만 삼항 연산자가 사용됩니다. 여기서 for 루프는 마지막 필드를 제외한 모든 필드 뒤에 인쇄됩니다 OFS. 그러면 $i마지막 필드 다음에 ORS개행 문자가 인쇄됩니다.

또 다른 방법:

awk 'BEGIN{OFS="\\"} { n=split($0,arr,OFS); $0=""; for (i=4; i<=n; ++i) $(i-3)=arr[i]; print }' input

여기에 내장된 함수는 배열을 split()분할 $0하고 생성합니다 . 그런 다음 for 루프는 레코드의 각 필드를 로 변경합니다 . 예를 들어 for 루프의 첫 번째 요소의 경우 arr[4]가 됩니다. 왜냐면 .​​ 루프가 완료되면 새 레코드는 이전 레코드의 네 번째 필드( )에서 시작됩니다 . 그런 다음 print 명령은 new 를 인쇄합니다 .OFSarr$(i-3)=arr[i]$1$1$(4-3)$1awk$0$0$0

답변4

놓치지 마세요 perl:

perl -e '@a=split /\\/, $ARGV[0]; print(join("\\", splice @a, 3), "\n")' $str

str길은 어디에 있나요?

또는 후행 줄 바꾸기 없이:

perl -e '@a=split /\\/, $ARGV[0]; print join "\\", splice @a, 3' $str

관련 정보