我一直试图从以下位置提取括号(包括括号)之间的子字符串:
"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 `('
我该怎么办?
答案 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将其放回原处。