我有一根绳子
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
这是 awk 中 print-the-record 的神秘简写。
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 指出的,可以使用[^/]*
( 零个或多个字符,除了) 来代替第二种情况。例子:/
.*?
$ grep -o '^[^/]*//[^/]*//' <<< "hdfs://ussbssn01.us.xyz.com//data/ip/list/usa//"
hdfs://ussbssn01.us.xyz.com//
答案3
var
如果 shell 变量 、 、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
。