regex 如何使用sed删除部分行echo输出

khbbv19g  于 2023-01-06  发布在  其他
关注(0)|答案(4)|浏览(142)

我想删除一些行。我已经有git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git,我只需要离开roi4cio-catalogs-fe。我用了下一个代码,但它不是正常工作。
echo git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git | sed -r 's/.*\///' | sed -r 's/\.+//'

jk9hmnmh

jk9hmnmh1#

您的命令没有给予正确的结果,因为您在此处重复了一个点1次或多次:

sed -r 's/.*\///' | sed -r 's/\.+//'
                              ^^^

但您希望匹配点后面的一个或多个字符:

sed -r 's/.*\///' | sed -r 's/\..+//'
                              ^^^^

要只保留最后一个/到最后一个.之前的部分,可以使用一个带有捕获组和反向引用的命令:

echo git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git | 
    sed -E 's/.*\/([^/]+)\.[^./]+$/\1/'

产出

roi4cio-catalogs-fe
wbgh16ku

wbgh16ku2#

***第一个解决方案:***对于awk,您可以尝试以下代码。其中将字段分隔符设置为.com/.git,并根据需要打印第三个字段。

echo "git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git" | 
awk -F'\\.com:|\\/|\\.git' '{print $3}'

***第二个解决方案:***使用GNU grep,请尝试以下解决方案。

echo "git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git" |
grep -oP '^.*?\/\K.*(?=\.git$)'
ee7vknir

ee7vknir3#

使用awk

echo git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git |
    awk -F'[/.]' '{print $3}'

使用sed

echo git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git |
    sed -E 's|.*/([^\.]+)\..*|\1|'

仅使用bash

IFS='/.' read _ _ var _ <<< git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git
echo "$var"

或使用 * 参数扩展 *:

x='git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git'
x=${x%.git}
x=${x##*/}"
echo "$x"

或者使用BASH_REMATCH

[[ $x =~ /([^\.]+)\. ]] && echo "${BASH_REMATCH[1]}"

使用Perl

echo git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git |
    perl -lne 'print $1 if m|/([^.]+)\.|'

使用grep

echo git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git |
    grep -oP '(?<=/)([^.]+)'

输出

roi4cio-catalogs-fe
cidc1ykv

cidc1ykv4#

使用sed

$ echo git@gitlab.com:awg-roi-new/roi4cio-catalogs-fe.git | sed -r 's~.*/|\..*~~g'
roi4cio-catalogs-fe

相关问题