이것은 문자열(쉘 변수의 값)입니다:
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
실제로 bash
POSIX 모드에 있는 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)
과 동일합니다 .X
X*
grep
sed
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%%/*}"}