如何在bash脚本中将字符串修剪为任意一个特定字符



我想将一个字符串从一个字符(最后一个/(修剪为第一个出现的:@。例如:

https://www.example.com/?client=safari/this-text:not-this:or_this

将被调整为:

this-text

https://www.example.com/?client=safari/this-text@not-this:or_this 

将被调整为:

this-text

我知道我可以将bash中的文本从一个特定字符修剪到另一个字符,但有没有办法将一个字符修剪到两个字符中的任何一个?

像这样使用grepgrep -Po '^.*/K[^:@]*'

示例:

echo 'https://www.example.com/?client=safari/this-text:not-this:or_this' | grep -Po '^.*/K[^:@]*'

或:

echo 'https://www.example.com/?client=safari/this-text@not-this:or_this' | grep -Po '^.*/K[^:@]*'

输出:

this-text

这里,grep使用以下选项:
-P:使用Perl正则表达式
-o:只打印匹配项,1个匹配项/行,不打印整行。

正则表达式^.*/K[^:@]*执行以下操作:

^.*/:从字符串的开头(^(一直匹配到最后一个斜线('/'(
K:假设比赛在这个位置开始
[^:@]*:除:@之外的任何字符零次或多次出现(贪婪(。这将匹配到行的末尾,或者匹配到下一个:@,以先到者为准。

另请参阅:
grep手动

注意:
这适用于GNUgrep,根据您的系统,可能需要安装它。例如,要在macOS上安装GNUgrep,请参阅以下答案:https://apple.stackexchange.com/a/357426/329079

带有一点Bash函数:

trim() {
local str=${1##*/}
printf '%sn' "${str%%[:@]*}"
}

这首先修剪直到并包括最后一个/的所有内容,然后修剪从第一次出现:@开始的所有内容。

使用中:

$ trim 'https://www.example.com/?client=safari/this-text:not-this:or_this'
this-text
$ trim 'https://www.example.com/?client=safari/this-text@not-this:or_this'
this-text

另一种方法是使用sed:sed -e 's,^.*/,,' -e 's,[:@].*$,,'

第一个-e命令(s/regex/replacement/(从开始到最后一个/删除文本,然后第二个-e:@删除到文本末尾。

echo 'https://www.example.com/?client=safari/this-text:not-this:or_this' | sed -e 's,^.*/,,' -e 's,[:@].*$,,'
this-text

最新更新