regex - 如何使用 sed 在文件中创建此模式

标签 regex linux shell sed centos

我有这个文件

Array ( [0] => ROLE_ADMIN@READ@User [1] => ROLE_ADMIN_DD_USER@READ@User [2] => ROLE_DD_USER@READ@* [3] => ROLE_USER@READ@User [4] => IS_AUTHENTICATED_ANONYMOUSLY@*@User [5] => *@READ@User [6] => ROLE_ADMIN@form@User [7] => *@form@User [8] => 

我想提取 ROLE_ADMIN@READ@User 部分,然后将它们以逗号分隔。

[ ROLE_ADMIN@READ@User , ROLE_ADMIN@READ@User ]

我已经在 sed 中试过了

sed -re 's/ ([A-Z_\*]*)@([A-Za-z\*]*)@[a-z\*]*/#/g' role.txt

这已经完成了一半;我不确定下一步该怎么做。你能帮忙吗?

最佳答案

与其 try catch => 之后的值,替换其他所有内容会更容易:

sed -e 's/.* \[0] => /[ /' -e 's/\[[0-9]*] =>/,/g' -e 's/[, ]*$/]/' role.txt

解释:

  • 第一个表达式将开始部分替换为 [
  • 第二个表达式将所有中间部分替换为,
  • 第三个表达式用 ] 替换尾随逗号和空格

所以你最终得到:

[ ROLE_ADMIN@READ@User , ROLE_ADMIN_DD_USER@READ@User , ROLE_DD_USER@READ@* , ROLE_USER@READ@User , IS_AUTHENTICATED_ANONYMOUSLY@*@User , *@READ@User , ROLE_ADMIN@form@User , *@form@User ]

如果你想对条目进行排序,那么我推荐使用 perl:

perl -ne '@u = m/=> *(\S+)/g; print "[ ", join(" , ", sort(@u)), " ]\n"' < role.txt

这会给你:

[ *@READ@User , *@form@User , IS_AUTHENTICATED_ANONYMOUSLY@*@User , ROLE_ADMIN@READ@User , ROLE_ADMIN@form@User , ROLE_ADMIN_DD_USER@READ@User , ROLE_DD_USER@READ@* , ROLE_USER@READ@User ]

关于regex - 如何使用 sed 在文件中创建此模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20806677/

相关文章:

linux - I2C_SLAVE ioctl 目的

linux - 将非 PIC 对象链接到具有 PIC 对象的可执行文件是否有效

linux - 将使用 ssh 远程执行的 grep 命令的输出存储到变量?

php - 用于检查两个第一个单词是否相同的正则表达式

正则表达式检查一组字符的不重复

python - 多个 re.sub() 语句

linux - Cron 作业神秘地停止运行?

shell - 从 Notepad Plus Plus 和当前目录运行文件

PHP 执行 shell 命令并返回完整输出

r - R中按段落分割