【问题标题】:Linux regex - Using an OR operator at beginning of lineLinux regex - 在行首使用 OR 运算符
【发布时间】:2014-01-24 14:36:39
【问题描述】:

我有一个 csv 文件,我需要从中提取第一列。我想获取标题(由字母组成)和仅由数字组成的数据。

示例输入:

"HEADER1","HEADER2"
"1234567","TEXT"
"3456789","TEXT2"

由于两者都封装在双引号中,我的输出应该是:

"HEADER"
"1234567"
"3456789"

我目前正在使用以下正则表达式,它只给我数据而不是标题。我认为中间的“或”运算符将包括任何文本以及用双引号封装的数字。知道为什么这没有给我我的标题吗?

grep -o "^\"[0-9]\+\"\|^\"[A-Z]\+\"\"" test.csv > test2.csv

干杯

【问题讨论】:

  • 你试过grep -o "^\"[0-9A-Z]\+\"" test.csv 吗?
  • 谢谢@leu - 太简单了!
  • @leu,[0-9]\+\|[A-Z]\+[0-9A-Z]\+ 之间是有区别的。

标签: regex linux shell


【解决方案1】:

问题是您两次关闭了"[A-Z]\+" 的报价:

grep -o "^\"[0-9]\+\"\|^\"[A-Z]\+\"\"" test.csv > test2.csv
                                   ^^

删除它,一切都很好。为了便于理解,请使用单引号:

grep -o '^"[0-9]\+"\|^"[A-Z]\+"' test.csv > test2.csv

【讨论】:

  • 正则表达式有问题吗?我会很感激 cmets 投反对票,这样我也可以学习。
【解决方案2】:

您的正则表达式末尾包含太多 \"。 使用:

grep -o "^\"[0-9]\+\"\|^\"[A-Z]\+\"" test.csv > test2.csv

【讨论】:

    【解决方案3】:

    你可以使用awk:

    awk -F, '$1 ~ /"[0-9]+|[a-zA-Z]+"/ {print $1}' file
    

    【讨论】:

    • 谢谢,知道有用!
    猜你喜欢
    • 2015-07-08
    • 2014-09-30
    • 2012-04-23
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多