提取匹配字符串之前的所有内容

提取匹配字符串之前的所有内容

我有一根绳子

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

相关内容