Regex 使用sed从字符串中提取子字符串
我刚从做正则表达式开始使用sed。我想从Regex 使用sed从字符串中提取子字符串,regex,shell,sed,terminal,Regex,Shell,Sed,Terminal,我刚从做正则表达式开始使用sed。我想从******/XXXXXX>中提取XXXXXX,所以我跟着 sed -n "/^/*/(\S*\).>$/p" 如果我这样做,我会得到以下错误 sed:1:“/^/(\S)。>$/p”:无效的命令代码* 我不确定我在这里遗漏了什么。试试: $ echo '*****/XXXXXX>' | sed 's|.*/||; s|>.*||' XXXXXX 替换命令s |.*/| |删除字符串中直到最后一个/的所有内容。替换命令s |>.| |
******/XXXXXX>
中提取XXXXXX
,所以我跟着
sed -n "/^/*/(\S*\).>$/p"
如果我这样做,我会得到以下错误
sed:1:“/^/(\S)。>$/p”:无效的命令代码*
我不确定我在这里遗漏了什么。试试:
$ echo '*****/XXXXXX>' | sed 's|.*/||; s|>.*||'
XXXXXX
替换命令s |.*/| |
删除字符串中直到最后一个/
的所有内容。替换命令s |>.| |
删除字符串中第一个
到行尾的所有内容
或:
替换命令
s |.*/(.*)>|\1 |
捕获最后一个/
和最后一个
之间的任何内容,并将其保存在组1中。然后将其替换为组1,\1
替换为grep
,如果您有pcre
选项
$ echo '*****/XXXXXX>' | grep -oP '/\K[^>]+'
XXXXXX
正向查找/\K
-不属于输出的一部分/
字符,而非[^>]+
- 在我看来,awk在这项任务中表现得更好。使用-F可以使用多个分隔符,如“/”和“>”:
当然,您可以使用sed,但是理解起来更复杂。首先,我删除第一部分(以“/”分隔),然后删除第二部分(以“>”分隔):
两者都将带来预期的结果:XXXXXX
echo '*****/XXXXXX>' |sed 's/^.*\/\|>$//g'
XXXXXX
从行的开始处开始,然后继续,直到lask/
也找到
,然后找到EOL,如果找到其中任何一个,则将其替换为空白
echo "*****/XXXXXX>" | awk -F'/|>' '{print $1}'
echo "*****/XXXXXX>" | sed -e s/.*[/]// -e s/\>//
echo '*****/XXXXXX>' |sed 's/^.*\/\|>$//g'
XXXXXX