bash sed替换从第一次出现到右



我正在尝试获取/

之前的第一个单词我使用以下sed:

echo 'a/b/c' | sed 's/(.*)/(.*)/1/g'

但这里给出的是a/b,我希望它只给出a

任何想法?

可以使用

echo 'a/b/c' | sed 's,([^/]*)/.*,1,'

细节:

  • ([^/]*)-第1组(1):除/
  • 以外的任何零或多个字符
  • /- a/char
  • .*-字符串的剩余部分。

或者,如果您有一个变量,您可以使用字符串操作:

s='a/b/c'
echo "${s%%/*}"
# => a

这里,%%从末尾删除匹配/*glob模式的最长子字符串,直到字符串中包含它的第一个/

这可以在bash本身中轻松完成,而无需调用任何外部实用程序:

s='a/b/c'
echo "${s%%/*}"
a
# or else
echo "${s//*}"
a

使用sed和替代分隔符来防止与数据中的类似字符冲突。

$ echo 'a/b/c' | sed 's#/.*##'
a

使用cut而不是sed来隔离字符分隔字段,以获得清晰、简单和效率:

$ echo 'a/b/c' | cut -d'/' -f1
a
$ echo 'a/b/c/d/e/f/g/h/i' | cut -d'/' -f5
e

最新更新