/bin/sed -e 's/^X//' -e 's%^.*/%%' 是什么意思?

编译libjpeg-turbo时会在根目录下自动生成一个名为cjpeg的可执行脚本,其中有这样一个函数:

func_parse_lt_options ()
{
  lt_script_arg0=$0
  shift
  for lt_opt
  do
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
    --lt-dump-script)
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
      ;;
    --lt-*)
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1
      ;;
    esac
  done

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "cjpeg:cjpeg:${LINENO}: libtool wrapper (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1" 1>&2
  fi
}

其中

/bin/sed -e 's/^X//' -e 's%/[^/]*$%%'
/bin/sed -e 's/^X//' -e 's%^.*/%%'

这两条语句我有点不太理解……
实际执行了一下,从pipe传过来一个描述路径的字符串,这两条语句分别会提取父目录路径和文件名。不过还是看不懂两条语句最后的字符串。
这两次调用sed具体是如何执行的操作?

阅读 4.8k
1 个回答
新手上路,请多包涵

在别人帮助下理解了。

sed读到以s开头的字符串时会把s之后的下一个字符作为分隔符,并不是必须使用/为分隔符。
比如
sed -e 's/old/new/'
sed -e 's@old@new@'
sed -e 's%old%new%'
sed -e 's,old,new,'
都是正确的,执行了相同的功能

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进