Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed从字符串中提取子字符串_Regex_Shell_Sed_Terminal - Fatal编程技术网

Regex 使用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 |>.| |

我刚从做正则表达式开始使用sed。我想从
******/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