나에겐 밧줄이 있어요
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
var
ksh
문자열이 쉘 변수 에 존재하는 경우 또는 bash
:
$ var="hdfs://ussbssn01.us.xyz.com//data/ip/list/usa/"
$ printf "%s\n" "${var%//*}"
hdfs://ussbssn01.us.xyz.com
변수 대체는 값을 ${var%suffix}
잘라냅니다 .suffix
var