我尝试搜索并替换字符串的多个模式,并将其替换为不同的值。但是该命令仅替换一个模式,而忽略其余模式。
output=$(echo "$output4" | awk 'NR>1 {gsub(/\[|]/,""); gsub("+r","READ"); gsub("+r+w","READ and WRITE"); gsub("+r+w+g","READ, WRITE and GRANT"); print}')
当我执行脚本时,这就是我得到的结果。
Group Analyst_Corp in security domain Native: READ. Group Finance_Dev in security domain Native: READ+w. Manufacturing_Corp in security domain Native: READ+w
Information_Tech in security domain Native: READ+w+g.
我正在寻找像这样的输出。
Group Analyst_Corp in security domain Native: READ. Group Finance_Dev in security domain Native: READ and WRITE. Manufacturing_Corp in security domain Native: READ and WRITE
Information_Tech in security domain Native: READ, WRITE and GRANT.
猜测 OP 的输入(即
output4
变量的内容),并加入一些[
字符]
以便更好地衡量:当前代码存在一些问题:
+r+w+g
),然后再替换较短的字符串(例如+r
)+
特殊含义,因此为了匹配文字,+
我们需要对其进行转义(\+
或[+]
)\
你会遇到更少的问题/
[]
可以使用动态(用双引号括起来的模式)或静态正则表达式[
,]
),但我们将换成一个更容易阅读/理解的不同正则表达式修改 OP 当前代码的几个不同选项:
所有这些都会产生:
折叠为单行并将结果存储在变量中
output
:所有这些都会产生:
+r+w
按长度降序替换重叠的模式。否则替换后就找不到了+r
。您还需要转义
+
,因为它在正则表达式中具有特殊含义。如果你对稍有不同(但含义相同)的输出不满意,你可以替换
使用
让
file.txt
内容成为然后
给出输出
请注意,而不是
READ and WRITE and GRANT
并且READ, WRITE and GRANT
也将适用于独立+w
和+g
。(在 GNU Awk 5.1.0 中测试)