使用sed从字符串中提取子字符串

时间:2016-09-23 01:58:32

标签: regex shell sed terminal

我刚开始使用sed做正则表达式。我想从XXXXXX中提取*****/XXXXXX>所以我正在关注

sed -n "/^/*/(\S*\).>$/p"

如果我这样做,我会收到以下错误

  

sed:1:" / ^ / /(\ S )。> $ / p":无效的命令代码*

我不确定我在这里失踪了什么。

4 个答案:

答案 0 :(得分:1)

尝试:

$ echo '*****/XXXXXX>' | sed 's|.*/||; s|>.*||'
XXXXXX

替换命令s|.*/||会删除字符串中最后一个/的所有内容。替换命令s|>.*||将从保留的字符串中的第一个>中删除所有内容。

或者:

$ echo '*****/XXXXXX>' | sed -E 's|.*/(.*)>|\1|'
XXXXXX

替换命令s|.*/(.*)>|\1|捕获最后/和最后>之间的任何内容,并将其保存在第1组中。然后将其替换为第1组,\1

答案 1 :(得分:1)

在我看来, awk 可以更好地执行此任务。使用-F可以使用多个分隔符,例如“/”和“>”:

echo "*****/XXXXXX>" | awk -F'/|>' '{print $1}'

当然你可以使用 sed ,但理解起来会更复杂。首先我删除第一部分(由“/”分隔)和第二部分(由“>”分隔):

echo "*****/XXXXXX>" | sed -e s/.*[/]// -e s/\>//

两者都会带来预期的结果:XXXXXX。

答案 2 :(得分:0)

如果您有grep选项

,请使用pcre

$ echo '*****/XXXXXX>' | grep -oP '/\K[^>]+'
XXXXXX
  • /\K正面看待/ - 不属于输出
  • [^>]+ >
  • 以外的字符

答案 3 :(得分:0)

echo '*****/XXXXXX>' |sed 's/^.*\/\|>$//g'
XXXXXX

从该行的开头开始,然后继续直到la /还找到>后跟EOL,如果发现其中任何一个,则将其替换为空白。