提取括号之间的字符串

时间:2020-08-03 10:32:02

标签: sed

我一直试图从以下位置提取括号(包括括号)之间的子字符串:

"WHITE-TAILED TROPIC-BIRD _Phaëthon lepturus_ (Hawaiian name—koae)"

我尝试过:

str=$(echo $1 | sed 's/.*\(\([^)]*\)\).*/\1/');
echo $str

我想得到的是:

"(Hawaiian name—koae)"

但是,我遇到了一个错误:

bash: syntax error near unexpected token `('

我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以使用

sed -n 's/.*\(([^()]*)\).*/\1/p'

在这里

  • -n-禁止默认行输出
  • .*\(([^()]*)\).*-匹配任何文本,然后将(捕获到组1中,然后捕获()以外的0个或更多字符,然后捕获{{1} },然后再次)将任何文本匹配到字符串的末尾
  • .*-用组1的内容替换整个匹配项
  • /\1/-打印结果。

请参见online demo

在名为p的脚本中:

script.sh

称呼为

#!/bin/bash
str=$(echo "$1" | sed -n 's/.*\(([^()]*)\).*/\1/p');
echo "$str"

结果:bash ./script.sh "WHITE-TAILED TROPIC-BIRD _Phaëthon lepturus_ (Hawaiian name—koae)"

答案 1 :(得分:1)

echo "WHITE-TAILED TROPIC-BIRD _Phaëthon lepturus_ (Hawaiian name—koae)" | \
cut -d'_' -f3 | sed s'@^ @@'

如果您有很好的定界符,那么使用sed截取部分线要容易得多。当我确切知道字符的位置时,我才真正使用sed替换字符。对于更复杂的操作,我通常必须通过在ed之前和之后插入回车符来从文件中提取一段文本(因此将其放在自己的行上,然后我可以轻松地将其取出),使对我想要使用sed进行的细微更改,然后使用ed将其放回原处。

相关问题