/가 처음 나타날 때까지 모든 문자를 공백으로 바꿉니다.

/가 처음 나타날 때까지 모든 문자를 공백으로 바꿉니다.

이것은 문자열(쉘 변수의 값)입니다:

2908104 /var/cache/yum/x86_64/7Server/Patches/gen

예상 출력:

/var/cache/yum/x86_64/7Server/Patches/gen

첫 번째 /로 시작하는 값만 검색하려면 어떻게 해야 하나요? 저는 sed를 처음 접하고 Linux를 처음 사용합니다.

답변1

Linux를 커널로 사용하는 시스템 grep(RHEL의 GNU 및 기타 일반 GNU/Linux 배포판, 대부분의 Linux 기반 시스템의 busybox, Android의 toybox)에서 일반적인 구현을 통해 다음을 수행할 수 있습니다.

LC_ALL=C grep -o '/.*' <input

/하나 이상의 줄이 있는 경우 첫 번째 줄부터 시작하여 부분을 인쇄합니다.

POSIX적으로:

LC_ALL=C sed -n 's|^[^/]*/|/|p' <input

문자열이 POSIX 유사 셸(예: sh실제로 bashPOSIX 모드에 있는 RHEL)의 셸 변수에 저장된 경우.

new_string=${string#"${string%%/*}"}

( 아무것도 포함되지 않은 경우 $new_string비어 있음 )$string/

${string%%/*}가장 긴 일치 접미사를 제거합니다 /*. 결과는 ${string#pattern}해당 패턴과 일치하는 가장 짧은 접두사가 제거된 패턴으로 간주됩니다. 여기서는 ${string%%/*}인용된 대로 패턴이 아닌 리터럴 문자열로 처리됩니다.

를 사용하면 zsh다음 작업도 수행할 수 있습니다.

new_string=${(M)string%%/*}

와 함께M 매개변수 확장 플래그, 이러한 모든 ${string#pattern}(또는 ##, :#, %) %%연산자는 일치하는 부분을 삭제하지 않고 M추가 부분(그것 없이 삭제될 부분)으로 확장합니다.

/가 아닌 문자를 모두 제거할 수도 있습니다.

  • zsh:

    set -o extendedglob
    new_string=${string##[^/]#}
    
  • ksh93/ bash -O extglob:

    new_string=${string##*([^/])}
    

여기서 X#(zsh) 또는 (ksh)는 0개 이상의 s와 일치하며 이는 위에 사용된 정규식 *(X)과 동일합니다 .XX*grepsed


1은 스마트 전구, TV 또는 네트워크 장치에 내장되는 경우가 많기 때문에 최종 사용자는 쉘 및 유틸리티(있는 경우)와 상호 작용하는 경우가 거의 없습니다.

답변2

첫 번째 공백까지 포함하여 쉘 변수 값의 초기 부분을 제거하려면 다음을 수행하십시오.

var=${var#* }

*이는 변수에서 쉘 패턴("별 공간")과 일치하는 가장 짧은 접두사 문자열을 제거합니다 var. 또한보십시오쉘 매개변수 확장Bash 매뉴얼 섹션 또는매개변수 확장POSIX 표준의 일부입니다.

예:

$ var='2908104 /var/cache/yum/x86_64/7Server/Patches/gen'
$ var=${var#* }
$ printf 'var is "%s"\n' "$var"
var is "/var/cache/yum/x86_64/7Server/Patches/gen"

또는 더 짧게(변수에 대한 실제 변경이 필요하지 않은 경우)

$ var='2908104 /var/cache/yum/x86_64/7Server/Patches/gen'
$ printf 'The trimmed value of var is "%s"\n' "${var#* }"
The trimmed value of var is "/var/cache/yum/x86_64/7Server/Patches/gen"

분리하려는 문자열 앞에 공백이 여러 개 있고 실제로 사용해야 하는 경우 /다음에 설명된 방법을 사용하는 것이 좋습니다.Stefan Chazeras의 답변, 여기에 복사됨:

var=${var#"${var%%/*}"}

관련 정보