我有这个脚本:
#!/bin/bash
user=datab-admin-role
allusers="datab-admin-111role datab-admin-112role datab-admin-113role "
if(...)
then..
...
我只想 grep 以变量开头datab
和结尾的字符串的第一次出现。role
我正在尝试的是:
sed -n '/datab/,/role/p' filename
但它返回所有带有 datab 的字符串,并将其返回为:
user=datab-admin-role
我希望它只返回datab-admin-role
并将其分配给一个变量。
我会为此使用grep:
该
-o
标志意味着只返回与模式匹配的那部分行,而不是整行。该
-m 1
标志表示仅返回第一次出现。模式是以
datab
字母、数字和连字符开头的任何内容,然后role
是我假设你想要的,因为你不只是想要一个更长的字符串,里面有空格或标点符号或其他东西。分配给变量:
但我相信也有办法做到这
sed
一点。我可能会使用发布的 grep 解决方案,但是您可以在 sed 中使用捕获组来完成。
在 sed 中,
/pattern1/,/pattern2/
处理匹配模式之间的一系列行- 如果您想在单行上的模式之间进行匹配,您需要类似其中
\(
and\)
定义了一个捕获组,并\1
反向引用它,省略任何前导.*
和尾随.*
字符以模拟 grep-o
或--only-matching
标志(我们q
在第一次匹配后模拟 grep-m1
)。或者使用 GNU sed
(这里的
T
分支过去q
直到s
成功)。如有必要,您可以更改
(datab.*role)
为(datab[A-Za-z0-9-]*role)
进行更严格的匹配。perl 方法:
为每个调用
-l
添加一个换行符,print
并从每个输入行中删除尾随的换行符。意思是“-n
逐行读取输入文件并将给出的脚本-e
应用于每一行”。脚本本身尝试匹配
datab
最短的字符串 (.+?
),直到第一个role
。如果找到,我们打印匹配的内容(特殊变量$&
)并退出。要存储在变量中,只需执行以下操作: