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 를 인쇄합니다 .OFS
arr
$(i-3)=arr[i]
$1
$1
$(4-3)
$1
awk
$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