如何使用 awk 或 sed 删除多个元字符

How to remove multiple meta characters with awk or sed

我正在尝试使用 sed、awk 或 tr 或任何方便但快速的实用程序从 mu 命令行输出中删除一些元字符或特殊字符。此外,我在我的水平上尝试了一些有效的技巧,但在多次添加命令时..正是我在下面得到的..

1) 第一个是命令产生的确切输出..

$ getent netgroup login_access_foxone 
login_access_foxone  (-,cacti,) (-,multi,) (-,hipot,) (-,jack,)

2) 下面是 sed 的东西,它与 awk 结合产生所需的输出。

$ getent netgroup login_access_foxone | sed 's/login_access_onefarm//g' | sed 's/)/\n/g' | awk 'BEGIN {FS=","}{print }' | grep -v ^$
cacti
multi
hipot
jack

3) 下一个使用 tr 命令但又必须使用 cut 来获取输出..

$ getent netgroup login_access_foxone | tr -d '(' | tr ')' '\n' | cut -d, -f2
cacti
multi
hipot
jack

4) 这是与 awk 但又分为两部分

$ getent netgroup login_access_foxone | awk -v FS="[()]" '{for (i=2;i<=NF;i+=2) print $i }' | awk -F, '{print }'
cacti
multi
hipot
jack

5) 对 sed 进行了一些测试,但现在无法删除“-”和“,”并在每个名称后换行

$ getent netgroup login_access_foxone | sed 's/[(),]//g'
login_access_foxone  -cacti -multi -hipot -jack

$ getent netgroup login_access_foxone | sed 's|[()-]||g'
login_access_foxone  ,cacti, ,multi, ,hipot, ,jack,

6) 尝试使用一些丑陋的组合进行 sed,但输出包含空格时出现问题..

$ getent netgroup login_access_foxone | sed 's/[-,()]/\n/g'
login_access_foxone


cacti




multi




hipot




jack

我想到了用下面的代码删除空白行的想法,但是 agian 需要用另一个管道 sed..

$ getent netgroup login_access_foxone | sed 's/[-,()]/\n/g'|sed '/^\s*$/d'

awk 救援!

$ awk -F, '{for(i=2;i<=NF;i+=2) print $i}' file
cacti
multi
hipot
jack

$ awk -v RS=, '!(NR%2)' file
cacti
multi
hipot
jack

在第二种选择中,我们将每一行拆分为以逗号分隔的迷你记录。由于必填字段在两个逗号之间,我们将打印出偶数记录,这意味着记录号可以被二整除。订单自然保留(没有惊喜)。

您可以试试这个 sed,但与 awk 相比它相当冗长:

sed 's/[^(]*(-,\([^,]*\),)/\n/g;s/\n$//' file

我能想到的最短的解决方案:

grep -Po ',\K\w*'

示例:

grep -Po ',\K\w*'  <<< 'login_access_foxone  (-,cacti,) (-,multi,) (-,hipot,) (-,jack,)'
cacti
multi
hipot
jack

解释:

\K : 回顾

\w : [a-zA-Z_]

* :任意数量的匹配