일치하는 문자열 앞의 모든 것을 추출합니다.

일치하는 문자열 앞의 모든 것을 추출합니다.

나에겐 밧줄이 있어요

hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/

내가 원하는 건

hdfs://ussbssn01.us.xyz.com//

//awk, sed를 시도했지만 일치하는 문자열이 중복되어 예상한 결과를 얻지 못했습니다 . 원하는 결과를 얻을 수 있는 방법이 있나요?

답변1

처음 두 문자열과 일치하는 문자열을 얻으려면 다음을 수행하십시오.

$ s=hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/
$ echo "$s" | awk -F// '{print $1 FS $2 FS}'
hdfs://ussbssn01.us.xyz.com//

작동 방식:

  • -F//

    이는 awk에게 //필드 구분 기호로 사용하도록 지시합니다.

  • print $1 FS $2 FS

    이는 awk에게 첫 번째 필드, 필드 구분 기호, 두 번째 필드 및 다른 필드 구분 기호를 인쇄하도록 지시합니다.

선택하다

마지막으로 일치하는 문자열을 포함하여 모든 것을 얻으려면 다음을 수행하십시오.

$ echo "$s" | awk -F// '{$NF=""} 1' OFS=//
hdfs://ussbssn01.us.xyz.com//

작동 방식:

  • -F//

    이는 awk에게 //필드 구분 기호 로 사용하도록 지시합니다.입력하다.

  • $NF=""

    이는 awk에게 마지막 필드를 빈 문자열로 바꾸도록 지시합니다.

  • 1

    이것은 print-the-record에 대한 awk의 비밀스러운 약어입니다.

  • OFS=//

    이는 awk에게 //필드 구분 기호 로 사용하도록 지시합니다.산출.

답변2

그리고grep

$ grep -o '^.*//.*//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
hdfs://ussbssn01.us.xyz.com//

$ grep -oP '^.*?//.*?//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
hdfs://ussbssn01.us.xyz.com//

$ grep -oP '^.*?com//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
hdfs://ussbssn01.us.xyz.com//
  • 그룹이 두 개뿐인 경우 첫 번째 방법이 작동합니다.//
  • 두 번째는 두 번째 그룹의 대부분을 추출합니다.//
  • 세 번째는 원하는 문자열이 다음으로 끝나는 경우 유효합니다.com//

편집하다:

[^/]*@ilkkachu가 지적했듯이 두 번째 경우 대신 (0개 이상의 문자 제외)를 사용할 수 있습니다 . 예:/.*?

$ grep -o '^[^/]*//[^/]*//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa//"
hdfs://ussbssn01.us.xyz.com//

답변3

varksh문자열이 쉘 변수 에 존재하는 경우 또는 bash:

$ var="hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
$ printf "%s\n" "${var%//*}"
hdfs://ussbssn01.us.xyz.com

변수 대체는 값을 ${var%suffix}잘라냅니다 .suffixvar

관련 정보