【发布时间】:2017-01-31 18:16:54
【问题描述】:
我刚从做正则表达式开始使用 sed。我想从*****/XXXXXX> 中提取XXXXXX,所以我关注了
sed -n "/^/*/(\S*\).>$/p"
如果我这样做,我会收到以下错误
sed: 1: "/^//(\S).>$/p": 无效命令代码 *
我不确定我在这里缺少什么。
【问题讨论】:
我刚从做正则表达式开始使用 sed。我想从*****/XXXXXX> 中提取XXXXXX,所以我关注了
sed -n "/^/*/(\S*\).>$/p"
如果我这样做,我会收到以下错误
sed: 1: "/^//(\S).>$/p": 无效命令代码 *
我不确定我在这里缺少什么。
【问题讨论】:
试试:
$ echo '*****/XXXXXX>' | sed 's|.*/||; s|>.*||'
XXXXXX
替换命令s|.*/|| 删除字符串中直到最后一个/ 的所有内容。替换命令 s|>.*|| 删除字符串中第一个 > 中保留到行尾的所有内容。
或者:
$ echo '*****/XXXXXX>' | sed -E 's|.*/(.*)>|\1|'
XXXXXX
替换命令 s|.*/(.*)>|\1| 捕获最后一个 / 和最后一个 > 之间的任何内容并将其保存在第 1 组中。然后将其替换为第 1 组 \1。
【讨论】:
如果您有pcre 选项,请使用grep
$ echo '*****/XXXXXX>' | grep -oP '/\K[^>]+'
XXXXXX
/\K 积极的后视 / - 不是输出的一部分[^>]+ > 以外的字符
【讨论】:
在我看来,awk 在这项任务中表现得更好。使用 -F 可以使用多个分隔符,例如“/”和“>”:
echo "*****/XXXXXX>" | awk -F'/|>' '{print $1}'
当然你可以使用sed,但它更难理解。首先我要删除第一部分(由“/”分隔)和第二部分之后(由“>”分隔):
echo "*****/XXXXXX>" | sed -e s/.*[/]// -e s/\>//
两者都会带来预期的结果:XXXXXX。
【讨论】:
echo '*****/XXXXXX>' |sed 's/^.*\/\|>$//g'
XXXXXX
从行首开始,然后继续直到 lask / ALSO find > 后跟 EOL ,如果找到其中任何一个,则将其替换为空白。
【讨论】: