如何获得' /'的最后部分shell脚本中分隔的字符串

时间:2017-03-10 08:10:17

标签: regex bash shell sed grep

我有一个字符串,如下所示

"hub.docker.corp.net/suite/content-install:latest"

我需要获得"内容安装"从它..

所以如果任何这样的字符串我需要提取最后一部分的左边部分

所以如果字符串是

"aaaa/bbbb/cccc/dddd/eee:ff"

然后我只需要" eee"

提前致谢

5 个答案:

答案 0 :(得分:3)

echo $x
aaaa/bbbb/cccc/dddd/eee:ff
echo $x |sed -r 's|(^.*)/(.*?):(.*)|\2|'
eee

这是使用sed进行反向引用。这里,line被分成块,并且在替换字段中引用行的所需块,并使用\2作为第二个字段。

或使用grep

echo $x |grep -oP '^.*/\K.*?(?=:)'
eee

这是从行的开头到最后/的丢弃。然后它将打印在:之前的文本。

答案 1 :(得分:2)

@Beatrix:试试:

echo "aaaa/bbbb/cccc/dddd/eee:ff" | awk -F'[/:]' '{print $(NF-1)}'  

awk -F'[/:]'        ##### making field separator as / and :, so in awk by default delimiter is space so I am making it according to your requirements.
'{print $(NF-1)}'   ##### now printing the $(NF-1) field which is second last field of the line.

答案 2 :(得分:2)

我会使用一点修改后的@PS。解决方案:

grep -oP '^(.*/)?\K.*?(?=:|\z)'

测试一些不同的输入:

(echo "INPUT=RESULT"
while read -r from
do
    base=$(grep -oP '^(.*/)?\K.*?(?=:|\z)' <<<"$from")
    echo "$from=${base:-UNDEFINED}"
done <<'EOF') | column -s= -t
/aaa/bb:bb/fff:xx
/fff:xx
/fff:
/fff
/:xx
/
./aaa/bb:bb/fff:xx
./fff:xx
./fff:
./fff
./:xx
./
aaa/bb:bb/fff:xx
fff:xx
fff:
fff
:xx
EOF

打印

INPUT               RESULT
/aaa/bb:bb/fff:xx   fff
/fff:xx             fff
/fff:               fff
/fff                fff
/:xx                UNDEFINED
/                   UNDEFINED
./aaa/bb:bb/fff:xx  fff
./fff:xx            fff
./fff:              fff
./fff               fff
./:xx               UNDEFINED
./                  UNDEFINED
aaa/bb:bb/fff:xx    fff
fff:xx              fff
fff:                fff
fff                 fff
:xx                 UNDEFINED

答案 3 :(得分:1)

您也可以使用basenamecut

执行此操作
basename "hub.docker.corp.net/suite/content-install:latest" | cut -d':' -f1

basename将在最后一个&#34; /&#34;之后提供整个字符串。使用cut命令,您可以在&#34;之前得到字符串:&#34;分隔符。

答案 4 :(得分:0)

echo "hub.docker.corp.net/suite/content-install:latest"|sed -r 's#.*/([^:]+).*#\1#'