我想将一个字符串从一个字符(最后一个/
(修剪为第一个出现的:
或@
。例如:
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中的文本从一个特定字符修剪到另一个字符,但有没有办法将一个字符修剪到两个字符中的任何一个?
像这样使用grep
:grep -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