如何剪切以下字符串并在Bash中检索“未运行”状态。
我试过cut命令cut -d"STATUS"
,它正在抛出异常
EX:
$ echo "NAME(APACHE) STATUS(Not Running)
预期字符串:
Not Running
答案 0 :(得分:4)
使用bash
,正则表达式运算符~
string="NAME(APACHE) STATUS(Not Running)"
[[ $string =~ ^.*STATUS\((.*)\)$ ]] && printf "%s\n" "${BASH_REMATCH[1]}"
Not Running
将Awk
用作()
去限制器,
echo "NAME(APACHE) STATUS(Not Running)" | awk 'BEGIN{FS="[()]"}{print $4}'
Not Running
使用双倍参数替换,因为bash
不支持嵌套参数扩展,
temp1="${string#*)}"
temp2="${temp1%*)}"
printf "%s\n" "${temp2#*STATUS(}"
Not Running
使用GNU grep
及其PCRE - Perl Compatible Regular Expressions功能,-P
标记,
grep -oP '.*STATUS\(\K[^\)]+' <<<"$string"
Not Running
答案 1 :(得分:2)
替代解决方案:
使用sed
命令:
echo "NAME(APACHE) STATUS(Not Running)" | sed -rn 's/.*\(([^)]+)\)$/\1/p'
使用perl
实施:
echo "NAME(APACHE) STATUS(Not Running)" | perl -lne 'print $1 if /\(([^)]+)\)$/'
使用awk
命令(将大括号)(
视为字段分隔符FS
):
echo "NAME(APACHE) STATUS(Not Running)" | awk 'BEGIN{FS="[)(]"}{ print $(NF-1) }'
$(NF-1)
- 指向最后一个非空字段
\(([^)]+)\)$/
- 正则表达式模式,将匹配字符串末尾的大括号之间的字符序列
\1
(在sed
表达式内)和$1
(在perl
表达式内)指向第一个捕获的组(...)
答案 2 :(得分:1)
命令cut -d
仅适用于单字符分隔符,这就是为什么你不能使用&#34; STATUS&#34;作为分隔符。
您可以改用awk,或者使用另一个分隔符剪切,例如&#34;(&#34;:
echo "NAME(APACHE) STATUS(Not Running)" | cut -d'(' -f3
这将给出输出:
Not Running)
然后你可以删除最后一个&#34;)&#34;与tr
:
echo "NAME(APACHE) STATUS(Not Running)" | cut -d'(' -f3 | tr -d ')'
答案 3 :(得分:1)
使用<Button
android:text="@null"
android:stateListAnimator="@null"
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/colorButton"
android:background="@drawable/button_border" />
和grep
的另一种方式:
tr
正则表达式echo "NAME(APACHE) STATUS(Not Running)" | grep -o '([^)]\+)$' | tr -d '()'
匹配行尾的括号之间的任何内容。
([^)]\+)$
命令正在删除括号。