【问题标题】:Awk or shell script for executing following program用于执行以下程序的 awk 或 shell 脚本
【发布时间】:2013-03-07 10:41:32
【问题描述】:
mansa, amit, janani ,[rakesh]
aruna,mahesh,,prathiksha

这是我的意见。 我需要一个 shell 脚本或 awk 命令,以下列方式为我提供输出

mansa
amit
janani 
rakesh
aruna
mahesh
prathiksha

脚本应删除所有 , 的括号。

我试过了

awk -F "\[\][,]+" '{for(i=1;i<=NF;i++){print $i}}'

但它在每条记录后多打印一行。

【问题讨论】:

    标签: linux shell unix awk grep


    【解决方案1】:

    grep 更容易:

    $ grep -o '[a-z]\+' file
    mansa
    amit
    janani
    rakesh
    aruna
    mahesh
    prathiksha
    

    【讨论】:

    • 也可以grep -o '[a-z]\*' file吗?
    • @fedorqui 量词+ 是扩展正则表达式类的一部分,所以我需要转义(或使用-E 选项,或egrep * 是标准正则表达式,因此不需要转义,因此您需要执行 grep '[a-z]*' file 区别在于 + 表示一个或多个,而 * 表示零或多个在这种情况下都给出相同的结果,但 @987654331 @ 和 + 绝对不能互换。
    • 嗯,很有趣。谢谢,@sudo_O!
    • 或者更确切地说,\+ 是基本正则表达式 (BRE) 的 GNU 扩展。
    【解决方案2】:

    另一个选项可能是tr:

    tr -cs '[:alpha:]' '[\n*]' < file
    

    虽然如果有前导空格会创建空行,然后可以将其过滤掉:

    tr -cs '[:alpha:]' '[\n*]' < file | awk NF
    

    【讨论】:

      【解决方案3】:

      假设您只想删除方括号并从逗号分隔符中拆分项目,您可以使用以下内容:

      perl -pe 's/,+/,/g ; s/[\[\]]//g ; s/\s*,\s*/\n/g' foo.txt
      

      我推荐这种方法的原因是,如果您的命名值中包含数字或您可能想要保留的其他非字母字符。

      上面的 perl 表达式包含 3 个正则表达式。第一部分将多个逗号缩减为一个(以避免逗号之间出现空值。第二部分删除方括号。第三部分通过用换行符替换逗号(左侧或右侧有空格)来拆分值。

      输出如下:

      mansa
      amit
      janani
      rakesh
      aruna
      mahesh
      prathiksha
      

      【讨论】:

        猜你喜欢
        • 2011-05-21
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 2019-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多